You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by bo...@apache.org on 2018/08/07 23:36:20 UTC
[geode] branch feature/GEODE-5534 updated: GEODE-5534: Added
integration test
This is an automated email from the ASF dual-hosted git repository.
boglesby pushed a commit to branch feature/GEODE-5534
in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/feature/GEODE-5534 by this push:
new f471087 GEODE-5534: Added integration test
f471087 is described below
commit f4710870495d5a3eb9ba05e7502814e9ef58280f
Author: Barry Oglesby <bo...@pivotal.io>
AuthorDate: Tue Aug 7 16:33:07 2018 -0700
GEODE-5534: Added integration test
---
.../QueryOnCompressedRegionWithIndexTest.java | 238 +++++++++++++++++++++
1 file changed, 238 insertions(+)
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/cache/query/internal/index/QueryOnCompressedRegionWithIndexTest.java b/geode-core/src/integrationTest/java/org/apache/geode/cache/query/internal/index/QueryOnCompressedRegionWithIndexTest.java
new file mode 100644
index 0000000..6ed14ae
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/cache/query/internal/index/QueryOnCompressedRegionWithIndexTest.java
@@ -0,0 +1,238 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.geode.cache.query.internal.index;
+
+import static org.apache.geode.cache.RegionShortcut.PARTITION;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_OVERFLOW;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_PERSISTENT;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_PERSISTENT_OVERFLOW;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_REDUNDANT;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_REDUNDANT_OVERFLOW;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_REDUNDANT_PERSISTENT;
+import static org.apache.geode.cache.RegionShortcut.PARTITION_REDUNDANT_PERSISTENT_OVERFLOW;
+import static org.apache.geode.cache.RegionShortcut.REPLICATE;
+import static org.apache.geode.cache.RegionShortcut.REPLICATE_OVERFLOW;
+import static org.apache.geode.cache.RegionShortcut.REPLICATE_PERSISTENT;
+import static org.apache.geode.cache.RegionShortcut.REPLICATE_PERSISTENT_OVERFLOW;
+import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
+import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import org.apache.geode.cache.Cache;
+import org.apache.geode.cache.CacheFactory;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionShortcut;
+import org.apache.geode.cache.query.Index;
+import org.apache.geode.cache.query.Query;
+import org.apache.geode.cache.query.SelectResults;
+import org.apache.geode.cache.query.data.Portfolio;
+import org.apache.geode.cache.query.data.PortfolioPdx;
+import org.apache.geode.cache.query.internal.QueryObserverAdapter;
+import org.apache.geode.cache.query.internal.QueryObserverHolder;
+import org.apache.geode.compression.SnappyCompressor;
+import org.apache.geode.test.junit.categories.OQLIndexTest;
+import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+
+@Category({OQLIndexTest.class})
+@RunWith(Parameterized.class)
+@Parameterized.UseParametersRunnerFactory(CategoryWithParameterizedRunnerFactory.class)
+public class QueryOnCompressedRegionWithIndexTest {
+
+ private Cache cache;
+
+ private Region region;
+
+ @Parameterized.Parameters(name = "{0}")
+ public static Collection<RegionShortcut> getRegionShortcuts() {
+ List<RegionShortcut> shortcuts = new ArrayList<>();
+ shortcuts.add(PARTITION);
+ shortcuts.add(PARTITION_REDUNDANT);
+ shortcuts.add(PARTITION_PERSISTENT);
+ shortcuts.add(PARTITION_REDUNDANT_PERSISTENT);
+ shortcuts.add(PARTITION_OVERFLOW);
+ shortcuts.add(PARTITION_REDUNDANT_OVERFLOW);
+ shortcuts.add(PARTITION_PERSISTENT_OVERFLOW);
+ shortcuts.add(PARTITION_REDUNDANT_PERSISTENT_OVERFLOW);
+ shortcuts.add(REPLICATE);
+ shortcuts.add(REPLICATE_PERSISTENT);
+ shortcuts.add(REPLICATE_OVERFLOW);
+ shortcuts.add(REPLICATE_PERSISTENT_OVERFLOW);
+ return shortcuts;
+ }
+
+ @Parameterized.Parameter
+ public RegionShortcut shortcut;
+
+ @Before
+ public void createCache() {
+ // Create cache
+ CacheFactory cf = new CacheFactory();
+ cf.set(MCAST_PORT, "0");
+ cf.set(LOCATORS, "");
+ cf.setPdxPersistent(true);
+ this.cache = cf.create();
+
+ // Create region with compression enabled
+ this.region = createRegion("region_" + shortcut, shortcut);
+ }
+
+ @After
+ public void closeCache() {
+ // Destroy the region
+ if (this.region != null) {
+ this.region.destroyRegion();
+ }
+
+ // Destroy the cache
+ if (this.cache != null) {
+ this.cache.close();
+ }
+
+ // Delete backup files
+ deleteBackupFiles();
+ }
+
+ private void deleteBackupFiles() {
+ File backupBaseDir = new File(".");
+ Pattern pattern = Pattern.compile("BACKUP.*");
+ File[] files = backupBaseDir.listFiles((dir, name) -> pattern.matcher(name).matches());
+ for (File file : files) {
+ file.delete();
+ }
+ }
+
+ @Test
+ public void testCreateIndexThenAddEntries() throws Exception {
+ // Create index
+ String indexName = this.region.getName() + "_index";
+ createIndex(indexName, "status", this.region.getFullPath());
+
+ // Load entries
+ int numObjects = 10;
+ loadEntries(this.region, numObjects, false);
+
+ // Execute queries and validate results
+ executeQueriesAndValidateResults(numObjects, indexName);
+ }
+
+ @Test
+ public void testCreateIndexThenAddPdxEntries() throws Exception {
+ // Create index
+ String indexName = this.region.getName() + "_index";
+ createIndex(indexName, "status", this.region.getFullPath());
+
+ // Load entries
+ int numObjects = 10;
+ loadEntries(this.region, numObjects, true);
+
+ // Execute queries and validate results
+ executeQueriesAndValidateResults(numObjects, indexName);
+ }
+
+ @Test
+ public void testAddEntriesThenCreateIndex() throws Exception {
+ // Load entries
+ int numObjects = 10;
+ loadEntries(this.region, numObjects, false);
+
+ // Create index
+ String indexName = this.region.getName() + "_index";
+ createIndex(indexName, "status", this.region.getFullPath());
+
+ // Execute queries and validate results
+ executeQueriesAndValidateResults(numObjects, indexName);
+ }
+
+ @Test
+ public void testAddPdxEntriesThenCreateIndex() throws Exception {
+ // Load entries
+ int numObjects = 10;
+ loadEntries(this.region, numObjects, true);
+
+ // Create index
+ String indexName = this.region.getName() + "_index";
+ createIndex(indexName, "status", this.region.getFullPath());
+
+ // Execute queries and validate results
+ executeQueriesAndValidateResults(numObjects, indexName);
+ }
+
+ private Region createRegion(String regionName, RegionShortcut shortcut) {
+ return this.cache.createRegionFactory(shortcut).setCompressor(new SnappyCompressor())
+ .create(regionName);
+ }
+
+ private Index createIndex(String indexName, String indexedExpression, String regionPath)
+ throws Exception {
+ return this.cache.getQueryService().createIndex(indexName, indexedExpression, regionPath);
+ }
+
+ private void loadEntries(Region region, int numObjects, boolean usePdx) {
+ for (int i = 0; i < numObjects; i++) {
+ region.put(i, usePdx ? new PortfolioPdx(i) : new Portfolio(i));
+ }
+ }
+
+ private void executeQueriesAndValidateResults(int numObjects, String indexName) throws Exception {
+ executeQuery("select * from " + this.region.getFullPath() + " where status = 'inactive'",
+ numObjects / 2, indexName);
+ executeQuery("select * from " + this.region.getFullPath() + " where status = 'active'",
+ numObjects / 2, indexName);
+ executeQuery("select * from " + this.region.getFullPath() + " where status = null", 0,
+ indexName);
+ }
+
+ private void executeQuery(String queryStr, int expectedResults, String indexName)
+ throws Exception {
+ // Set query observer
+ QueryObserverImpl observer = new QueryObserverImpl();
+ QueryObserverHolder.setInstance(observer);
+
+ // Execute query
+ Query query = this.cache.getQueryService().newQuery(queryStr);
+ SelectResults results = (SelectResults) query.execute();
+
+ // Validate results size
+ assertThat(results.size()).isEqualTo(expectedResults);
+
+ // Validate index was used
+ assertThat(observer.wasIndexUsed(indexName)).isTrue();
+ }
+
+ class QueryObserverImpl extends QueryObserverAdapter {
+ List indexesUsed = new ArrayList();
+
+ public void beforeIndexLookup(Index index, int oper, Object key) {
+ indexesUsed.add(index.getName());
+ }
+
+ public boolean wasIndexUsed(String indexName) {
+ return indexesUsed.contains(indexName);
+ }
+ }
+}