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/18 00:37:42 UTC

[geode] branch develop updated: GEODE-3727: FlatFormatSerializer should support collection

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

zhouxj pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new c9cff18  GEODE-3727: FlatFormatSerializer should support collection
c9cff18 is described below

commit c9cff1821ee089144e3d862c4110c4532c6964ff
Author: zhouxh <gz...@pivotal.io>
AuthorDate: Mon Oct 16 17:15:13 2017 -0700

    GEODE-3727: FlatFormatSerializer should support collection
    
    This closes #933
---
 .../geode/cache/lucene/FlatFormatSerializer.java   |  31 +++-
 .../lucene/FlatFormatSerializerJUnitTest.java      | 120 ++++++++++++---
 .../NestedObjectSeralizerIntegrationTest.java      | 168 ++++++++++++++++++---
 .../apache/geode/cache/lucene/test/Customer.java   |  19 ++-
 .../org/apache/geode/cache/lucene/test/Person.java |   8 +-
 5 files changed, 292 insertions(+), 54 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 99690b2..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
@@ -30,7 +30,7 @@ import org.apache.lucene.document.Document;
 /**
  * A built-in {@link LuceneSerializer} to parse user's nested object into a flat format, i.e. a
  * single document. Each nested object will become a set of fields, with field name in format of
- * contact.name, contact.homepage.title.
+ * contacts.name, contacts.homepage.title.
  * 
  * Here is a example of usage:
  * 
@@ -38,16 +38,18 @@ import org.apache.lucene.document.Document;
  * objects' indexed fields in following format:
  * 
  * luceneService.createIndexFactory().setLuceneSerializer(new FlatFormatSerializer())
- * .addField("name").addField("contact.name").addField("contact.email", new KeywordAnalyzer())
- * .addField("contact.address").addField("contact.homepage.content") .create(INDEX_NAME,
+ * .addField("name").addField("contacts.name").addField("contacts.email", new KeywordAnalyzer())
+ * .addField("contacts.address").addField("contacts.homepage.content") .create(INDEX_NAME,
  * REGION_NAME);
  * 
  * Region region = createRegion(REGION_NAME, RegionShortcut.PARTITION);
  * 
- * When querying, use the same dot-separated index field name, such as contact.homepage.content
+ * When querying, use the same dot-separated index field name, such as contacts.homepage.content
  * 
  * LuceneQuery query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME,
- * "contact.homepage.content:Hello*", "name"); results = query.findPages();
+ * "contacts.homepage.content:Hello*", "name");
+ * 
+ * results = query.findPages();
  */
 public class FlatFormatSerializer implements LuceneSerializer {
 
@@ -57,7 +59,7 @@ public class FlatFormatSerializer implements LuceneSerializer {
 
   /**
    * Recursively serialize each indexed field's value into a field of lucene document. The field
-   * name will be in the same format as its indexed, such as contact.homepage.content
+   * name will be in the same format as its indexed, such as contacts.homepage.content
    * 
    * @param index lucene index
    * @param value user object to be serialized into index
@@ -94,6 +96,23 @@ public class FlatFormatSerializer implements LuceneSerializer {
       return;
     }
 
+    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);
+      }
+    } else {
+      addFieldValueForNonCollectionObject(doc, indexedFieldName, fieldValue, tokenizedFields);
+    }
+  }
+
+  private void addFieldValueForNonCollectionObject(Document doc, String indexedFieldName,
+      Object fieldValue, List<String> tokenizedFields) {
     if (tokenizedFields.size() == 1) {
       SerializerUtil.addField(doc, indexedFieldName, fieldValue);
     } else {
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 7106472..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
@@ -14,15 +14,22 @@
  */
 package org.apache.geode.cache.lucene;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
 
 import org.apache.geode.cache.lucene.FlatFormatSerializer;
 import org.apache.geode.cache.lucene.internal.repository.serializer.SerializerTestHelper;
 import org.apache.geode.cache.lucene.test.Customer;
+import org.apache.geode.cache.lucene.test.Page;
+import org.apache.geode.cache.lucene.test.Person;
 import org.apache.geode.test.junit.categories.UnitTest;
 import org.apache.lucene.document.Document;
+import org.apache.lucene.index.IndexableField;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
@@ -31,29 +38,75 @@ public class FlatFormatSerializerJUnitTest {
 
   @Test
   public void shouldParseMultiLayerNestObject() {
-    String[] fields = new String[] {"name", "contact.name", "contact.email", "contact.revenue",
-        "contact.address", "contact.homepage.id", "contact.homepage.title",
-        "contact.homepage.content", LuceneService.REGION_VALUE_FIELD};
+    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};
 
     FlatFormatSerializer serializer = new FlatFormatSerializer();
-    Customer customer = new Customer("Tommy Jackson", "Tommi Jackson", 13);
+
+    Person contact1 = new Person("Tommi Jackson", new String[] {"5036330001", "5036330002"}, 1);
+    Person contact2 = new Person("Tommi2 Skywalker", new String[] {"5036330003", "5036330004"}, 2);
+    HashSet<Person> contacts1 = new HashSet();
+    contacts1.add(contact1);
+    contacts1.add(contact2);
+    ArrayList<String> phoneNumbers = new ArrayList();
+    phoneNumbers.add("5035330001");
+    phoneNumbers.add("5035330002");
+    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(fields.length - 1, doc1.getFields().size());
+    assertEquals(23, doc1.getFields().size());
     assertEquals("Tommy Jackson", doc1.getField("name").stringValue());
-    assertEquals("Tommi Jackson", doc1.getField("contact.name").stringValue());
-    assertEquals("Tommi.Jackson@pivotal.io", doc1.getField("contact.email").stringValue());
-    assertEquals(1300, doc1.getField("contact.revenue").numericValue());
-    assertEquals("13 NW Greenbrier PKWY, Portland OR 97006",
-        doc1.getField("contact.address").stringValue());
-    assertEquals("developer", doc1.getField("contact.homepage.title").stringValue());
-    assertEquals("Hello world no 13", doc1.getField("contact.homepage.content").stringValue());
+
+    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"));
+
+    fieldsInDoc = doc1.getFields("contacts.email");
+    results = getStringResultCollection(fieldsInDoc);
+    assertEquals(2, results.size());
+    assertTrue(results.contains("Tommi.Jackson@pivotal.io"));
+    assertTrue(results.contains("Tommi2.Skywalker@pivotal.io"));
+
+    fieldsInDoc = doc1.getFields("contacts.revenue");
+    Collection<Integer> intResults = getIntResultCollection(fieldsInDoc);
+    assertEquals(2, intResults.size());
+    assertTrue(intResults.contains(100));
+    assertTrue(intResults.contains(200));
+
+    fieldsInDoc = doc1.getFields("contacts.address");
+    results = getStringResultCollection(fieldsInDoc);
+    assertEquals(2, results.size());
+    assertTrue(results.contains("1 NW Greenbrier PKWY, Portland OR 97006"));
+    assertTrue(results.contains("2 NW Greenbrier PKWY, Portland OR 97006"));
+
+    fieldsInDoc = doc1.getFields("contacts.homepage.title");
+    results = getStringResultCollection(fieldsInDoc);
+    assertEquals(2, results.size());
+    assertTrue(results.contains("developer"));
+    assertTrue(results.contains("manager"));
+
+    fieldsInDoc = doc1.getFields("contacts.homepage.content");
+    results = getStringResultCollection(fieldsInDoc);
+    assertEquals(2, results.size());
+    assertTrue(results.contains("Hello world no 1"));
+    assertTrue(results.contains("Hello world no 1"));
   }
 
   @Test
   public void shouldParseRegionValueFieldForString() {
-    String[] fields = new String[] {"name", "contact.name", "contact.email", "contact.revenue",
-        "contact.address", "contact.homepage.id", "contact.homepage.title",
-        "contact.homepage.content", LuceneService.REGION_VALUE_FIELD};
+    String[] fields = new String[] {"name", "contacts.name", "contacts.email", "contacts.revenue",
+        "contacts.address", "contacts.homepage.id", "contacts.homepage.title",
+        "contacts.homepage.content", LuceneService.REGION_VALUE_FIELD};
 
     FlatFormatSerializer serializer = new FlatFormatSerializer();
     String str = new String("Hello world");
@@ -64,9 +117,9 @@ public class FlatFormatSerializerJUnitTest {
 
   @Test
   public void shouldParseRegionValueFieldForInteger() {
-    String[] fields = new String[] {"name", "contact.name", "contact.email", "contact.revenue",
-        "contact.address", "contact.homepage.id", "contact.homepage.title",
-        "contact.homepage.content", LuceneService.REGION_VALUE_FIELD};
+    String[] fields = new String[] {"name", "contacts.name", "contacts.email", "contacts.revenue",
+        "contacts.address", "contacts.homepage.id", "contacts.homepage.title",
+        "contacts.homepage.content", LuceneService.REGION_VALUE_FIELD};
 
     FlatFormatSerializer serializer = new FlatFormatSerializer();
     Integer integer = 15;
@@ -78,13 +131,38 @@ public class FlatFormatSerializerJUnitTest {
   @Test
   public void shouldNotParseNestedObjectWithoutFields() {
     String[] fields =
-        new String[] {"name", "contact", "contact.homepage", "contact.missing", "missing2"};
+        new String[] {"name", "contacts", "contacts.homepage", "contacts.missing", "missing2"};
 
     FlatFormatSerializer serializer = new FlatFormatSerializer();
-    Customer customer = new Customer("Tommy Jackson", "Tommi Jackson", 13);
+    HashSet<Person> contacts1 = new HashSet();
+    Person contact1 = new Person("Tommi Jackson", new String[] {"5036330001", "5036330002"}, 1);
+    Person contact2 = new Person("Tommi2 Skywalker", new String[] {"5036330003", "5036330004"}, 2);
+    contacts1.add(contact1);
+    contacts1.add(contact2);
+    ArrayList<String> phoneNumbers = new ArrayList();
+    phoneNumbers.add("5035330001");
+    phoneNumbers.add("5035330002");
+    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());
   }
 
+  private Collection<String> getStringResultCollection(IndexableField[] fieldsInDoc) {
+    Collection<String> results = new LinkedHashSet();
+    for (IndexableField field : fieldsInDoc) {
+      results.add(field.stringValue());
+    }
+    return results;
+  }
+
+  private Collection<Integer> getIntResultCollection(IndexableField[] fieldsInDoc) {
+    Collection<Integer> results = new LinkedHashSet();
+    for (IndexableField field : fieldsInDoc) {
+      results.add((Integer) field.numericValue());
+    }
+    return results;
+  }
+
 }
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 542d5be..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
@@ -18,12 +18,17 @@ import static org.apache.geode.cache.lucene.test.LuceneTestUtilities.INDEX_NAME;
 import static org.apache.geode.cache.lucene.test.LuceneTestUtilities.REGION_NAME;
 import static org.junit.Assert.assertEquals;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.geode.cache.Region;
 import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.cache.lucene.test.Customer;
+import org.apache.geode.cache.lucene.test.Page;
+import org.apache.geode.cache.lucene.test.Person;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.test.junit.categories.IntegrationTest;
 import org.apache.lucene.analysis.core.KeywordAnalyzer;
@@ -40,10 +45,11 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
 
   private Region createRegionAndIndex() {
     luceneService.createIndexFactory().setLuceneSerializer(new FlatFormatSerializer())
-        .addField("name").addField("contact.name").addField("contact.email", new KeywordAnalyzer())
-        .addField("contact.address").addField("contact.homepage.content")
-        .addField("contact.homepage.id").addField(LuceneService.REGION_VALUE_FIELD)
-        .create(INDEX_NAME, REGION_NAME);
+        .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")
+        .addField(LuceneService.REGION_VALUE_FIELD).create(INDEX_NAME, REGION_NAME);
 
     Region region = createRegion(REGION_NAME, RegionShortcut.PARTITION);
     return region;
@@ -51,18 +57,64 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
 
   private Region createRegionAndIndexOnInvalidFields() {
     luceneService.createIndexFactory().setLuceneSerializer(new FlatFormatSerializer())
-        .addField("name").addField("contact").addField("contact.page").addField("contact.missing")
-        .addField("missing2").create(INDEX_NAME, REGION_NAME);
+        .addField("name").addField("contacts").addField("contacts.page")
+        .addField("contacts.missing").addField("missing2").create(INDEX_NAME, REGION_NAME);
 
     Region region = createRegion(REGION_NAME, RegionShortcut.PARTITION);
     return region;
   }
 
   private void feedSomeNestedObjects(Region region) throws InterruptedException {
-    region.put("object-13", new Customer("Tommy Jackson", "Tommi Jackson", 13));
-    region.put("object-14", new Customer("Johnny Jackson", "Johnni Jackson", 14));
-    region.put("object-15", new Customer("Johnny Jackson2", "Johnni Jackson2", 15));
-    region.put("object-16", new Customer("Johnny Jackson21", "Johnni Jackson21", 16));
+    Person contact1 = new Person("Tommi Jackson", new String[] {"5036330001", "5036330002"}, 1);
+    Person contact2 = new Person("Tommi2 Skywalker", new String[] {"5036330003", "5036330004"}, 2);
+    HashSet<Person> contacts1 = new HashSet();
+    contacts1.add(contact1);
+    contacts1.add(contact2);
+    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, myHomePages1);
+    region.put("object-13", customer13);
+
+    Person contact3 = new Person("Johnni Jackson", new String[] {"5036330005", "5036330006"}, 3);
+    Person contact4 = new Person("Jackson Skywalker", new String[] {"5036330007", "5036330008"}, 4);
+    ArrayList<Person> contacts2 = new ArrayList();
+    contacts2.add(contact3);
+    contacts2.add(contact4);
+    phoneNumbers = new ArrayList();
+    phoneNumbers.add("5035330003");
+    phoneNumbers.add("5035330004");
+    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);
+    Person contact6 =
+        new Person("Jackson2 Skywalker", new String[] {"5036330011", "5036330012"}, 6);
+    ArrayList<Person> contacts3 = new ArrayList();
+    contacts3.add(contact5);
+    contacts3.add(contact6);
+    phoneNumbers = new ArrayList();
+    phoneNumbers.add("5035330005");
+    phoneNumbers.add("5035330006");
+    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);
+    Person contact8 =
+        new Person("Jackson21 Skywalker", new String[] {"5036330015", "5036330016"}, 8);
+    ArrayList<Person> contacts4 = new ArrayList();
+    contacts4.add(contact7);
+    contacts4.add(contact8);
+    phoneNumbers = new ArrayList();
+    phoneNumbers.add("5035330007");
+    phoneNumbers.add("5035330008");
+    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");
     region.put("key-2", "region value 2");
     region.put("key-3", "region value 3");
@@ -74,12 +126,87 @@ 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);
 
     query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME,
-        "contact.name:jackson2*", "name");
+        "contacts.name:jackson2*", "name");
     results = query.findPages();
     assertEquals(2, results.size());
     printResults(results);
@@ -91,7 +218,7 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
     feedSomeNestedObjects(region);
 
     query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME,
-        "\"Johnni Jackson\"", "contact.name");
+        "\"Johnni Jackson\"", "contacts.name");
     results = query.findPages();
     assertEquals(1, results.size());
     printResults(results);
@@ -125,9 +252,8 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
     Region region = createRegionAndIndex();
     feedSomeNestedObjects(region);
 
-    // query-3: contact.email with KeywordAnalyzer
     query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME,
-        "Johnni.Jackson2@pivotal.io", "contact.email");
+        "Johnni.Jackson2@pivotal.io", "contacts.email");
     results = query.findPages();
     assertEquals(1, results.size());
     printResults(results);
@@ -151,7 +277,7 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
     feedSomeNestedObjects(region);
 
     query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME, "97006",
-        "contact.address");
+        "contacts.address");
     results = query.findPages();
     assertEquals(4, results.size());
     printResults(results);
@@ -174,7 +300,7 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
     feedSomeNestedObjects(region);
 
     query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME,
-        "contact.homepage.content:Hello", "name");
+        "contacts.homepage.content:Hello", "name");
     results = query.findPages();
     printResults(results);
     assertEquals(4, results.size());
@@ -223,7 +349,7 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
     feedSomeNestedObjects(region);
 
     query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME,
-        "\"Johnni Jackson\"", "contact.name");
+        "\"Johnni Jackson\"", "contacts.name");
     results = query.findPages();
     assertEquals(0, results.size());
   }
@@ -248,7 +374,7 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
     feedSomeNestedObjects(region);
 
     query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME,
-        "Johnni.Jackson2@pivotal.io", "contact.email");
+        "Johnni.Jackson2@pivotal.io", "contacts.email");
     results = query.findPages();
     assertEquals(0, results.size());
   }
@@ -260,7 +386,7 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
     feedSomeNestedObjects(region);
 
     query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME, "97006",
-        "contact.address");
+        "contacts.address");
     results = query.findPages();
     assertEquals(0, results.size());
   }
@@ -272,7 +398,7 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
     feedSomeNestedObjects(region);
 
     query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME,
-        "contact.homepage.content:Hello", "name");
+        "contacts.homepage.content:Hello", "name");
     results = query.findPages();
     assertEquals(0, results.size());
   }
@@ -284,7 +410,7 @@ public class NestedObjectSeralizerIntegrationTest extends LuceneIntegrationTest
     feedSomeNestedObjects(region);
 
     query = luceneService.createLuceneQueryFactory().create(INDEX_NAME, REGION_NAME, "*",
-        "contact.missing");
+        "contacts.missing");
     results = query.findPages();
     assertEquals(0, results.size());
   }
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 a75a4b5..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
@@ -15,19 +15,30 @@
 package org.apache.geode.cache.lucene.test;
 
 import java.io.Serializable;
+import java.util.Collection;
+import java.util.Collections;
 
 public class Customer implements Serializable {
   private String name;
-  private Person contact; // search nested object
+  private Collection<String> phoneNumbers;
+  private Collection<Person> contacts;
+  private Page[] myHomePages;
 
-  public Customer(String name, String contactName, int pageId) {
+  public Customer(String name, Collection<String> phoneNumbers, Collection<Person> contacts,
+      Page[] myHomePages) {
     this.name = name;
+    this.phoneNumbers = phoneNumbers;
+    this.contacts = contacts;
+    this.myHomePages = myHomePages;
+  }
 
-    this.contact = new Person(contactName, pageId);
+  public void addContact(Person contact) {
+    this.contacts.add(contact);
   }
 
   @Override
   public String toString() {
-    return "Customer[name=" + name + ",contact=" + contact + "]";
+    return "Customer[name=" + name + ",phoneNumbers=" + phoneNumbers + ",contacts=" + contacts
+        + ",homepage=" + myHomePages + "]";
   }
 }
diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/test/Person.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/test/Person.java
index 7034177..3916a29 100644
--- a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/test/Person.java
+++ b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/test/Person.java
@@ -15,25 +15,29 @@
 package org.apache.geode.cache.lucene.test;
 
 import java.io.Serializable;
+import java.util.Collection;
+import java.util.Collections;
 
 public class Person implements Serializable {
   private String name;
   private String email;
   private int revenue;
   private String address;
+  private String[] phoneNumbers;
   private Page homepage;
 
-  public Person(String name, int pageId) {
+  public Person(String name, String[] phoneNumbers, int pageId) {
     this.name = name;
     this.email = name.replace(' ', '.') + "@pivotal.io";
     this.revenue = pageId * 100;
     this.address = "" + pageId + " NW Greenbrier PKWY, Portland OR 97006";
+    this.phoneNumbers = phoneNumbers;
     this.homepage = new Page(pageId);
   }
 
   @Override
   public String toString() {
     return "Person[name=" + name + ",email=" + email + ",revenue=" + revenue + ",address=" + address
-        + ",homepage=" + homepage + "]";
+        + ",phone numbers=" + phoneNumbers + ",homepage=" + homepage + "]";
   }
 }

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