You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by zh...@apache.org on 2017/10/17 21:16:43 UTC

[geode] branch feature/GEODE-3727 updated: GEODE-3727: add support for array field

This is an automated email from the ASF dual-hosted git repository.

zhouxj pushed a commit to branch feature/GEODE-3727
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/feature/GEODE-3727 by this push:
     new c770bfc  GEODE-3727: add support for array field
c770bfc is described below

commit c770bfc67d64463ef59d3bf162de725c6ec8bfb9
Author: zhouxh <gz...@pivotal.io>
AuthorDate: Tue Oct 17 14:15:34 2017 -0700

    GEODE-3727: add support for array field
---
 .../geode/cache/lucene/FlatFormatSerializer.java   | 10 ++-
 .../repository/serializer/SerializerUtil.java      | 25 ------
 .../lucene/FlatFormatSerializerJUnitTest.java      | 20 +++--
 .../NestedObjectSeralizerIntegrationTest.java      | 93 +++++++++++++++++++---
 .../apache/geode/cache/lucene/test/Customer.java   |  8 +-
 5 files changed, 107 insertions(+), 49 deletions(-)

diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/FlatFormatSerializer.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/FlatFormatSerializer.java
index a4b94a2..7621356 100644
--- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/FlatFormatSerializer.java
+++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/FlatFormatSerializer.java
@@ -88,9 +88,6 @@ public class FlatFormatSerializer implements LuceneSerializer {
 
   private void addFieldValue(Document doc, String indexedFieldName, Object value,
       List<String> tokenizedFields) {
-    if (tokenizedFields.isEmpty()) {
-      return;
-    }
     String currentLevelField = tokenizedFields.get(0);
 
     Object fieldValue = getFieldValue(value, currentLevelField);
@@ -99,7 +96,12 @@ public class FlatFormatSerializer implements LuceneSerializer {
       return;
     }
 
-    if (fieldValue instanceof Collection) {
+    if (fieldValue.getClass().isArray()) {
+      Object[] array = (Object[]) fieldValue;
+      for (Object item : array) {
+        addFieldValueForNonCollectionObject(doc, indexedFieldName, item, tokenizedFields);
+      }
+    } else if (fieldValue instanceof Collection) {
       Collection collection = (Collection) fieldValue;
       for (Object item : collection) {
         addFieldValueForNonCollectionObject(doc, indexedFieldName, item, tokenizedFields);
diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/repository/serializer/SerializerUtil.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/repository/serializer/SerializerUtil.java
index 6fd0f9d..dde375d 100644
--- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/repository/serializer/SerializerUtil.java
+++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/repository/serializer/SerializerUtil.java
@@ -95,39 +95,14 @@ public class SerializerUtil {
     Class<?> clazz = fieldValue.getClass();
     if (clazz == String.class) {
       doc.add(new TextField(field, (String) fieldValue, Store.NO));
-    } else if (clazz == String[].class) {
-      String[] stringArray = (String[]) fieldValue;
-      for (String s : stringArray) {
-        doc.add(new TextField(field, s, Store.NO));
-      }
     } else if (clazz == Long.class) {
       doc.add(new LongPoint(field, (Long) fieldValue));
-    } else if (clazz == Long[].class) {
-      Long[] longArray = (Long[]) fieldValue;
-      for (Long l : longArray) {
-        doc.add(new LongPoint(field, l));
-      }
     } else if (clazz == Integer.class) {
       doc.add(new IntPoint(field, (Integer) fieldValue));
-    } else if (clazz == Integer[].class) {
-      Integer[] integerArray = (Integer[]) fieldValue;
-      for (Integer i : integerArray) {
-        doc.add(new IntPoint(field, i));
-      }
     } else if (clazz == Float.class) {
       doc.add(new FloatPoint(field, (Float) fieldValue));
-    } else if (clazz == Float[].class) {
-      Float[] floatArray = (Float[]) fieldValue;
-      for (Float f : floatArray) {
-        doc.add(new FloatPoint(field, f));
-      }
     } else if (clazz == Double.class) {
       doc.add(new DoublePoint(field, (Double) fieldValue));
-    } else if (clazz == Double[].class) {
-      Double[] doubleArray = (Double[]) fieldValue;
-      for (Double d : doubleArray) {
-        doc.add(new DoublePoint(field, d));
-      }
     } else {
       return false;
     }
diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/FlatFormatSerializerJUnitTest.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/FlatFormatSerializerJUnitTest.java
index a80ae60..7c45879 100644
--- a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/FlatFormatSerializerJUnitTest.java
+++ b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/FlatFormatSerializerJUnitTest.java
@@ -38,7 +38,7 @@ public class FlatFormatSerializerJUnitTest {
 
   @Test
   public void shouldParseMultiLayerNestObject() {
-    String[] fields = new String[] {"name", "phoneNumbers", "homepage.title", "contacts.name",
+    String[] fields = new String[] {"name", "phoneNumbers", "myHomePages.content", "contacts.name",
         "contacts.email", "contacts.phoneNumbers", "contacts.address", "contacts.revenue",
         "contacts.homepage.id", "contacts.homepage.title", "contacts.homepage.content",
         LuceneService.REGION_VALUE_FIELD};
@@ -53,15 +53,21 @@ public class FlatFormatSerializerJUnitTest {
     ArrayList<String> phoneNumbers = new ArrayList();
     phoneNumbers.add("5035330001");
     phoneNumbers.add("5035330002");
-    Page page1 = new Page(13);
-    Customer customer = new Customer("Tommy Jackson", phoneNumbers, contacts1, page1);
+    Page[] myHomePages1 = new Page[] {new Page(131), new Page(132)};
+    Customer customer = new Customer("Tommy Jackson", phoneNumbers, contacts1, myHomePages1);
     Document doc1 = SerializerTestHelper.invokeSerializer(serializer, customer, fields);
-    assertEquals(22, doc1.getFields().size());
+    assertEquals(23, doc1.getFields().size());
     assertEquals("Tommy Jackson", doc1.getField("name").stringValue());
 
-    IndexableField[] fieldsInDoc = doc1.getFields("contacts.name");
+    IndexableField[] fieldsInDoc = doc1.getFields("myHomePages.content");
     Collection<String> results = getStringResultCollection(fieldsInDoc);
     assertEquals(2, results.size());
+    assertTrue(results.contains("Hello world no 131"));
+    assertTrue(results.contains("Hello world no 132"));
+
+    fieldsInDoc = doc1.getFields("contacts.name");
+    results = getStringResultCollection(fieldsInDoc);
+    assertEquals(2, results.size());
     assertTrue(results.contains("Tommi Jackson"));
     assertTrue(results.contains("Tommi2 Skywalker"));
 
@@ -136,8 +142,8 @@ public class FlatFormatSerializerJUnitTest {
     ArrayList<String> phoneNumbers = new ArrayList();
     phoneNumbers.add("5035330001");
     phoneNumbers.add("5035330002");
-    Page page1 = new Page(13);
-    Customer customer = new Customer("Tommy Jackson", phoneNumbers, contacts1, page1);
+    Page[] myHomePages1 = new Page[] {new Page(131), new Page(132)};
+    Customer customer = new Customer("Tommy Jackson", phoneNumbers, contacts1, myHomePages1);
     Document doc1 = SerializerTestHelper.invokeSerializer(serializer, customer, fields);
     assertEquals(1, doc1.getFields().size());
     assertEquals("Tommy Jackson", doc1.getField("name").stringValue());
diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/NestedObjectSeralizerIntegrationTest.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/NestedObjectSeralizerIntegrationTest.java
index aefe7de..4893ca6 100644
--- a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/NestedObjectSeralizerIntegrationTest.java
+++ b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/NestedObjectSeralizerIntegrationTest.java
@@ -45,7 +45,7 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
 
   private Region createRegionAndIndex() {
     luceneService.createIndexFactory().setLuceneSerializer(new FlatFormatSerializer())
-        .addField("name").addField("phoneNumbers").addField("homepage.title")
+        .addField("name").addField("phoneNumbers").addField("myHomePages.content")
         .addField("contacts.name").addField("contacts.email", new KeywordAnalyzer())
         .addField("contacts.phoneNumbers").addField("contacts.address")
         .addField("contacts.homepage.content").addField("contacts.homepage.id")
@@ -70,11 +70,11 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
     HashSet<Person> contacts1 = new HashSet();
     contacts1.add(contact1);
     contacts1.add(contact2);
-    Page homepage1 = new Page(13);
+    Page[] myHomePages1 = new Page[] {new Page(131), new Page(132)};
     ArrayList<String> phoneNumbers = new ArrayList();
     phoneNumbers.add("5035330001");
     phoneNumbers.add("5035330002");
-    Customer customer13 = new Customer("Tommy Jackson", phoneNumbers, contacts1, homepage1);
+    Customer customer13 = new Customer("Tommy Jackson", phoneNumbers, contacts1, myHomePages1);
     region.put("object-13", customer13);
 
     Person contact3 = new Person("Johnni Jackson", new String[] {"5036330005", "5036330006"}, 3);
@@ -85,8 +85,8 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
     phoneNumbers = new ArrayList();
     phoneNumbers.add("5035330003");
     phoneNumbers.add("5035330004");
-    Page homepage2 = new Page(14);
-    Customer customer14 = new Customer("Johnny Jackson", phoneNumbers, contacts2, homepage2);
+    Page[] myHomePages2 = new Page[] {new Page(14), new Page(141)};
+    Customer customer14 = new Customer("Johnny Jackson", phoneNumbers, contacts2, myHomePages2);
     region.put("object-14", customer14);
 
     Person contact5 = new Person("Johnni Jackson2", new String[] {"5036330009", "5036330010"}, 5);
@@ -98,8 +98,8 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
     phoneNumbers = new ArrayList();
     phoneNumbers.add("5035330005");
     phoneNumbers.add("5035330006");
-    Page homepage3 = new Page(15);
-    Customer customer15 = new Customer("Johnny Jackson2", phoneNumbers, contacts3, homepage3);
+    Page[] myHomePages3 = new Page[] {new Page(15), new Page(151)};
+    Customer customer15 = new Customer("Johnny Jackson2", phoneNumbers, contacts3, myHomePages3);
     region.put("object-15", customer15);
 
     Person contact7 = new Person("Johnni Jackson21", new String[] {"5036330013", "5036330014"}, 7);
@@ -111,8 +111,8 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
     phoneNumbers = new ArrayList();
     phoneNumbers.add("5035330007");
     phoneNumbers.add("5035330008");
-    Page homepage4 = new Page(16);
-    Customer customer16 = new Customer("Johnny Jackson21", phoneNumbers, contacts4, homepage4);
+    Page[] myHomePages4 = new Page[] {new Page(16), new Page(161)};
+    Customer customer16 = new Customer("Johnny Jackson21", phoneNumbers, contacts4, myHomePages4);
     region.put("object-16", customer16);
 
     region.put("key-1", "region value 1");
@@ -126,6 +126,81 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
   }
 
   @Test
+  public void queryOnTopLevelObjectCollectionField_AND_BothExist()
+      throws InterruptedException, LuceneQueryException {
+    Region region = createRegionAndIndex();
+    feedSomeNestedObjects(region);
+
+    query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME, "131 AND 132",
+        "myHomePages.content");
+    results = query.findPages();
+    assertEquals(1, results.size());
+    printResults(results);
+  }
+
+  @Test
+  public void queryOnTopLevelObjectCollectionField_AND_OneExist()
+      throws InterruptedException, LuceneQueryException {
+    Region region = createRegionAndIndex();
+    feedSomeNestedObjects(region);
+
+    query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME, "131 AND 133",
+        "myHomePages.content");
+    results = query.findPages();
+    assertEquals(0, results.size());
+  }
+
+  @Test
+  public void queryOnTopLevelObjectCollectionField_OR_OneExist()
+      throws InterruptedException, LuceneQueryException {
+    Region region = createRegionAndIndex();
+    feedSomeNestedObjects(region);
+
+    query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME, "131 OR 133",
+        "myHomePages.content");
+    results = query.findPages();
+    assertEquals(1, results.size());
+    printResults(results);
+  }
+
+  @Test
+  public void queryOnTopLevelStringCollectionField_AND_BothExist()
+      throws InterruptedException, LuceneQueryException {
+    Region region = createRegionAndIndex();
+    feedSomeNestedObjects(region);
+
+    query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME,
+        "5035330007 AND 5035330008", "phoneNumbers");
+    results = query.findPages();
+    assertEquals(1, results.size());
+    printResults(results);
+  }
+
+  @Test
+  public void queryOnTopLevelStringCollectionField_AND_OneExist()
+      throws InterruptedException, LuceneQueryException {
+    Region region = createRegionAndIndex();
+    feedSomeNestedObjects(region);
+    query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME,
+        "5035330007 AND 5035330009", "phoneNumbers");
+    results = query.findPages();
+    assertEquals(0, results.size());
+  }
+
+  @Test
+  public void queryOnTopLevelStringCollectionField_OR_OneExist()
+      throws InterruptedException, LuceneQueryException {
+    Region region = createRegionAndIndex();
+    feedSomeNestedObjects(region);
+
+    query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME,
+        "5035330007 OR 5035330009", "phoneNumbers");
+    results = query.findPages();
+    assertEquals(1, results.size());
+    printResults(results);
+  }
+
+  @Test
   public void queryOnContactNameWithExpression() throws InterruptedException, LuceneQueryException {
     Region region = createRegionAndIndex();
     feedSomeNestedObjects(region);
diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/test/Customer.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/test/Customer.java
index c369722..e466e24 100644
--- a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/test/Customer.java
+++ b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/test/Customer.java
@@ -22,14 +22,14 @@ public class Customer implements Serializable {
   private String name;
   private Collection<String> phoneNumbers;
   private Collection<Person> contacts;
-  private Page homepage;
+  private Page[] myHomePages;
 
   public Customer(String name, Collection<String> phoneNumbers, Collection<Person> contacts,
-      Page homepage) {
+      Page[] myHomePages) {
     this.name = name;
     this.phoneNumbers = phoneNumbers;
     this.contacts = contacts;
-    this.homepage = homepage;
+    this.myHomePages = myHomePages;
   }
 
   public void addContact(Person contact) {
@@ -39,6 +39,6 @@ public class Customer implements Serializable {
   @Override
   public String toString() {
     return "Customer[name=" + name + ",phoneNumbers=" + phoneNumbers + ",contacts=" + contacts
-        + ",homepage=" + homepage + "]";
+        + ",homepage=" + myHomePages + "]";
   }
 }

-- 
To stop receiving notification emails like this one, please contact
['"commits@geode.apache.org" <co...@geode.apache.org>'].