You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kl...@apache.org on 2016/06/16 17:23:34 UTC

[14/23] incubator-geode git commit: GEODE-1545: add a test case for querying JSON in geode-lucene

GEODE-1545: add a test case for querying JSON in geode-lucene


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/ed32ceef
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/ed32ceef
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/ed32ceef

Branch: refs/heads/feature/GEODE-835
Commit: ed32ceefba89b5cd295659faa3368971ee4adabb
Parents: d5dae19
Author: zhouxh <gz...@pivotal.io>
Authored: Tue Jun 14 15:10:53 2016 -0700
Committer: zhouxh <gz...@pivotal.io>
Committed: Tue Jun 14 15:14:39 2016 -0700

----------------------------------------------------------------------
 .../lucene/LuceneQueriesIntegrationTest.java    | 68 ++++++++++++++++++++
 .../cache/lucene/test/LuceneTestUtilities.java  | 27 ++++++++
 .../gemfire/cache/lucene/test/TestObject.java   |  7 ++
 3 files changed, 102 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ed32ceef/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneQueriesIntegrationTest.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneQueriesIntegrationTest.java b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneQueriesIntegrationTest.java
index 536f5c3..95f5781 100644
--- a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneQueriesIntegrationTest.java
+++ b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneQueriesIntegrationTest.java
@@ -42,6 +42,8 @@ import com.gemstone.gemfire.cache.RegionShortcut;
 import com.gemstone.gemfire.cache.execute.FunctionException;
 import com.gemstone.gemfire.cache.lucene.test.TestObject;
 import com.gemstone.gemfire.cache.query.QueryException;
+import com.gemstone.gemfire.pdx.JSONFormatter;
+import com.gemstone.gemfire.pdx.PdxInstance;
 import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
 
 /**
@@ -96,6 +98,12 @@ public class LuceneQueriesIntegrationTest extends LuceneIntegrationTest {
     // query will be--field1:one field1:three
     verifyQuery("field1:one@three", DEFAULT_FIELD, "A", "B", "C");
     
+    HashMap expectedResults = new HashMap();
+    expectedResults.put("A", new TestObject(value1, value1));
+    expectedResults.put("B", new TestObject(value2, value2));
+    expectedResults.put("C", new TestObject(value3, value3));
+    verifyQuery("field1:one@three", expectedResults);
+    
     // keyword analyzer, this query will only match the entry that exactly matches
     // this query string will be parsed as "one three"
     // but keyword analyzer will parse one@three to be "one three"
@@ -155,6 +163,29 @@ public class LuceneQueriesIntegrationTest extends LuceneIntegrationTest {
   }
 
   @Test()
+  public void queryJsonObject() throws ParseException {
+    Map<String, Analyzer> fields = new HashMap<String, Analyzer>();
+    fields.put("name", null);
+    fields.put("lastName", null);
+    fields.put("address", null);
+    luceneService.createIndex(INDEX_NAME, REGION_NAME, fields);
+    Region region = cache.createRegionFactory(RegionShortcut.PARTITION)
+      .create(REGION_NAME);
+    final LuceneIndex index = luceneService.getIndex(INDEX_NAME, REGION_NAME);
+
+    //Put two values with some of the same tokens
+    PdxInstance pdx1 = insertAJson(region, "jsondoc1");
+    PdxInstance pdx2 = insertAJson(region, "jsondoc2");
+    PdxInstance pdx10 = insertAJson(region, "jsondoc10");
+    index.waitUntilFlushed(60000);
+
+    HashMap expectedResults = new HashMap();
+    expectedResults.put("jsondoc1", pdx1);
+    expectedResults.put("jsondoc10", pdx10);
+    verifyQuery("name:jsondoc1*", expectedResults);
+  }
+
+  @Test()
   public void throwFunctionExceptionWhenGivenBadQuery() {
     LuceneService luceneService = LuceneServiceProvider.get(cache);
     luceneService.createIndex(INDEX_NAME, REGION_NAME, "text");
@@ -178,6 +209,36 @@ public class LuceneQueriesIntegrationTest extends LuceneIntegrationTest {
     }
 
   }
+  
+  private PdxInstance insertAJson(Region region, String key) {
+    String jsonCustomer = "{"
+        + "\"name\": \""+key+"\","
+        + "\"lastName\": \"Smith\","
+        + " \"age\": 25,"
+        + "\"address\":"
+        + "{"
+        + "\"streetAddress\": \"21 2nd Street\","
+        + "\"city\": \"New York\","
+        + "\"state\": \"NY\","
+        + "\"postalCode\": \"10021\""
+        + "},"
+        + "\"phoneNumber\":"
+        + "["
+        + "{"
+        + " \"type\": \"home\","
+        + "\"number\": \"212 555-1234\""
+        + "},"
+        + "{"
+        + " \"type\": \"fax\","
+        + "\"number\": \"646 555-4567\""
+        + "}"
+        + "]"
+        + "}";
+
+    PdxInstance pdx = JSONFormatter.fromJSON(jsonCustomer);
+    region.put(key, pdx);
+    return pdx;
+  }
 
   private void verifyQuery(String query, String defaultField, String ... expectedKeys) throws ParseException {
     final LuceneQuery<String, Object> queryWithStandardAnalyzer = luceneService.createLuceneQueryFactory().create(
@@ -185,6 +246,13 @@ public class LuceneQueriesIntegrationTest extends LuceneIntegrationTest {
 
     verifyQueryKeys(queryWithStandardAnalyzer, expectedKeys);
   }
+  
+  private void verifyQuery(String query, HashMap expectedResults) throws ParseException {
+    final LuceneQuery<String, Object> queryWithStandardAnalyzer = luceneService.createLuceneQueryFactory().create(
+      INDEX_NAME, REGION_NAME, query);
+
+    verifyQueryKeyAndValues(queryWithStandardAnalyzer, expectedResults);
+  }
 
   private static class MyCharacterTokenizer extends CharTokenizer {
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ed32ceef/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/test/LuceneTestUtilities.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/test/LuceneTestUtilities.java b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/test/LuceneTestUtilities.java
index 6ef93bf..d7150d9 100644
--- a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/test/LuceneTestUtilities.java
+++ b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/test/LuceneTestUtilities.java
@@ -21,10 +21,12 @@ package com.gemstone.gemfire.cache.lucene.test;
 import static org.junit.Assert.*;
 
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
+import org.apache.logging.log4j.Logger;
 
 import com.gemstone.gemfire.cache.Cache;
 import com.gemstone.gemfire.cache.asyncqueue.AsyncEventQueue;
@@ -38,6 +40,9 @@ import com.gemstone.gemfire.cache.lucene.LuceneServiceProvider;
 import com.gemstone.gemfire.cache.lucene.internal.LuceneIndexForPartitionedRegion;
 import com.gemstone.gemfire.cache.lucene.internal.LuceneServiceImpl;
 import com.gemstone.gemfire.internal.cache.LocalRegion;
+import com.gemstone.gemfire.internal.logging.LogService;
+import com.gemstone.gemfire.pdx.JSONFormatter;
+import com.gemstone.gemfire.pdx.PdxInstance;
 
 public class LuceneTestUtilities {
   public static final String INDEX_NAME = "index";
@@ -96,6 +101,28 @@ public class LuceneTestUtilities {
     assertEquals(expectedKeySet, actualKeySet);
   }
 
+  /**
+   * Verify that a query returns the expected map of key-value. Ordering is ignored.
+   */
+  public static <K> void verifyQueryKeyAndValues(LuceneQuery<K,Object> query, HashMap expectedResults) {
+    HashMap actualResults = new HashMap<>();
+    final LuceneQueryResults<K, Object> results = query.search();
+    while(results.hasNextPage()) {
+      results.getNextPage().stream()
+        .forEach(struct -> {
+          Object value = struct.getValue();
+          if (value instanceof PdxInstance) {
+            PdxInstance pdx = (PdxInstance)value;
+            String jsonString = JSONFormatter.toJSON(pdx);
+            actualResults.put(struct.getKey(), pdx);
+          } else {
+            actualResults.put(struct.getKey(), value);
+          }
+        });
+    }
+    assertEquals(expectedResults, actualResults);
+  }
+  
   public static void pauseSender(final Cache cache) {
     final AsyncEventQueueImpl queue = (AsyncEventQueueImpl) getIndexQueue(cache);
     queue.getSender().pause();

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ed32ceef/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/test/TestObject.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/test/TestObject.java b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/test/TestObject.java
index a2b249e..9e984bd 100644
--- a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/test/TestObject.java
+++ b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/test/TestObject.java
@@ -49,4 +49,11 @@ public class TestObject implements Serializable {
   public void setField2(final String field2) {
     this.field2 = field2;
   }
+  
+  @Override
+  public boolean equals(Object obj) {
+    TestObject testObject = (TestObject)obj;
+    return (testObject.field1.equals(field1) && testObject.field2.equals(field2));
+  }
+
 }