You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by as...@apache.org on 2015/11/11 22:23:57 UTC

[25/50] [abbrv] incubator-geode git commit: Making lucene indexed fields their own XML element.

Making lucene indexed fields their own XML element.

Rather than <lucene:index fields="x,y"> fields are now listed as their
own individual elements, for example

<lucene:index>
  <lucene:field name="x"/>
</lucene:index>


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

Branch: refs/heads/develop
Commit: 71cd7c6c8c5e7d8baf451f5d5f4b1edbcf699370
Parents: 5011ee5
Author: Dan Smith <up...@apache.org>
Authored: Thu Oct 8 16:16:56 2015 -0700
Committer: Dan Smith <up...@apache.org>
Committed: Thu Oct 8 17:30:18 2015 -0700

----------------------------------------------------------------------
 .../cache/lucene/internal/LuceneIndexImpl.java  |  2 +-
 .../internal/xml/LuceneIndexCreation.java       | 20 +++++++----
 .../internal/xml/LuceneIndexXmlGenerator.java   |  9 +++--
 .../lucene/internal/xml/LuceneXmlConstants.java |  2 +-
 .../lucene/internal/xml/LuceneXmlParser.java    | 36 ++++++++++++++++----
 .../lucene/lucene-1.0.xsd                       |  8 ++++-
 .../xml/LuceneIndexXmlGeneratorJUnitTest.java   | 23 +++++++++++--
 .../xml/LuceneIndexXmlParserJUnitTest.java      | 16 +++++++--
 ...erIntegrationJUnitTest.createIndex.cache.xml | 12 +++++--
 ...serIntegrationJUnitTest.parseIndex.cache.xml | 12 +++++--
 10 files changed, 114 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/71cd7c6c/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexImpl.java
----------------------------------------------------------------------
diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexImpl.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexImpl.java
index 3964053..257861b 100644
--- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexImpl.java
+++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexImpl.java
@@ -85,7 +85,7 @@ public abstract class LuceneIndexImpl implements InternalLuceneIndex {
   protected void addExtension(PartitionedRegion dataRegion) {
     LuceneIndexCreation creation = new LuceneIndexCreation();
     creation.setName(this.getName());
-    creation.setFieldNames(this.getFieldNames());
+    creation.addFieldNames(this.getFieldNames());
     creation.setRegion(dataRegion);
     creation.setFieldFieldAnalyzerMap(this.getFieldAnalyzerMap());
     dataRegion.getExtensionPoint().addExtension(creation, creation);

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/71cd7c6c/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexCreation.java
----------------------------------------------------------------------
diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexCreation.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexCreation.java
index abb147a..5520f96 100644
--- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexCreation.java
+++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexCreation.java
@@ -1,6 +1,9 @@
 package com.gemstone.gemfire.cache.lucene.internal.xml;
 
+import java.util.Arrays;
+import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.lucene.analysis.Analyzer;
 
@@ -16,7 +19,7 @@ import com.gemstone.gemfire.internal.cache.xmlcache.XmlGenerator;
 public class LuceneIndexCreation implements LuceneIndex, Extension<Region<?, ?>> {
   private Region region;
   private String name;
-  private String[] fieldNames;
+  private Set<String> fieldNames = new LinkedHashSet<String>();
   private Map<String, Analyzer> fieldFieldAnalyzerMap;
 
   
@@ -28,10 +31,6 @@ public class LuceneIndexCreation implements LuceneIndex, Extension<Region<?, ?>>
     this.name = name;
   }
 
-  public void setFieldNames(String[] fieldNames) {
-    this.fieldNames = fieldNames;
-  }
-  
   public Map<String, Analyzer> getFieldFieldAnalyzerMap() {
     return fieldFieldAnalyzerMap;
   }
@@ -51,7 +50,7 @@ public class LuceneIndexCreation implements LuceneIndex, Extension<Region<?, ?>>
   }
 
   public String[] getFieldNames() {
-    return fieldNames;
+    return fieldNames.toArray(new String[fieldNames.size()]);
   }
 
   @Override
@@ -73,4 +72,13 @@ public class LuceneIndexCreation implements LuceneIndex, Extension<Region<?, ?>>
     //TODO - should this be a different method than the public API here?
     service.createIndex(getName(), getRegionPath(), getFieldNames());
   }
+
+  public void addField(String name) {
+    this.fieldNames.add(name);
+  }
+
+  public void addFieldNames(String[] fieldNames) {
+    this.fieldNames.addAll(Arrays.asList(fieldNames));
+    
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/71cd7c6c/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlGenerator.java
----------------------------------------------------------------------
diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlGenerator.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlGenerator.java
index 161e981..dcfbec6 100644
--- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlGenerator.java
+++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlGenerator.java
@@ -34,8 +34,13 @@ public class LuceneIndexXmlGenerator implements XmlGenerator<Region<?, ?>> {
     AttributesImpl attr = new AttributesImpl();
     //TODO - should the type be xs:string ?
     XmlGeneratorUtils.addAttribute(attr, NAME, index.getName());
-    XmlGeneratorUtils.addAttribute(attr, FIELDS, String.join(",", index.getFieldNames()));
-    XmlGeneratorUtils.emptyElement(cacheXmlGenerator.getContentHandler(), PREFIX, INDEX, attr);
+    XmlGeneratorUtils.startElement(handler, PREFIX, INDEX, attr);
+    for(String field : index.getFieldNames()) {
+      AttributesImpl fieldAttr = new AttributesImpl();
+      XmlGeneratorUtils.addAttribute(fieldAttr, NAME, field);
+      XmlGeneratorUtils.emptyElement(handler, PREFIX, FIELD, fieldAttr);
+    }
+    XmlGeneratorUtils.endElement(handler, PREFIX, INDEX);
   }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/71cd7c6c/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneXmlConstants.java
----------------------------------------------------------------------
diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneXmlConstants.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneXmlConstants.java
index 97193b8..45c08b6 100644
--- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneXmlConstants.java
+++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneXmlConstants.java
@@ -7,6 +7,6 @@ public class LuceneXmlConstants {
   public static final String NAME = "name";
   public static final String REGION = "index";
   public static final String INDEX = "index";
-  public static final String FIELDS = "fields";
+  public static final String FIELD = "field";
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/71cd7c6c/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneXmlParser.java
----------------------------------------------------------------------
diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneXmlParser.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneXmlParser.java
index 8630a44..e11814a 100644
--- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneXmlParser.java
+++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneXmlParser.java
@@ -27,28 +27,52 @@ public class LuceneXmlParser extends AbstractXmlParser {
     if(INDEX.equals(localName)) {
       startIndex(atts);
     }
+    if(FIELD.equals(localName)) {
+      startField(atts);
+    }
+  }
+
+  private void startField(Attributes atts) {
+    //Ignore any whitespace noise between fields
+    if(stack.peek() instanceof StringBuffer) {
+      stack.pop();
+    }
+    LuceneIndexCreation creation = (LuceneIndexCreation) stack.peek();
+    String name = atts.getValue(NAME);
+    creation.addField(name);
   }
 
   private void startIndex(Attributes atts) {
     final RegionCreation region = (RegionCreation) stack.peek();
     RegionAttributesCreation rac = (RegionAttributesCreation) region.getAttributes();
     String name = atts.getValue(NAME);
-    String[] fields = atts.getValue(FIELDS).split(" *, *");
     rac.addAsyncEventQueueId(LuceneServiceImpl.getUniqueIndexName(name, region.getFullPath()));
     
-    
     LuceneIndexCreation indexCreation = new LuceneIndexCreation();
     indexCreation.setName(name);
-    indexCreation.setFieldNames(fields);
     indexCreation.setRegion(region);
     region.getExtensionPoint().addExtension(indexCreation, indexCreation);
-    //TODO support nested field objects by adding the creation object to the stack
-    //stack.push(indexCreation)
+    stack.push(indexCreation);
   }
 
   @Override
   public void endElement(String uri, String localName, String qName)
       throws SAXException {
-    //Nothing to do.
+    if(!NAMESPACE.equals(uri)) {
+      return;
+    }
+    if(INDEX.equals(localName)) {
+      endIndex();
+    }
+  }
+
+  private void endIndex() {
+    //Ignore any whitespace noise between fields
+    if(stack.peek() instanceof StringBuffer) {
+      stack.pop();
+    }
+    
+    //Remove the index creation from the stack
+    stack.pop();
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/71cd7c6c/gemfire-lucene/src/main/resources/META-INF/schemas/geode.incubator.apache.org/lucene/lucene-1.0.xsd
----------------------------------------------------------------------
diff --git a/gemfire-lucene/src/main/resources/META-INF/schemas/geode.incubator.apache.org/lucene/lucene-1.0.xsd b/gemfire-lucene/src/main/resources/META-INF/schemas/geode.incubator.apache.org/lucene/lucene-1.0.xsd
index 66a4aad..88df552 100644
--- a/gemfire-lucene/src/main/resources/META-INF/schemas/geode.incubator.apache.org/lucene/lucene-1.0.xsd
+++ b/gemfire-lucene/src/main/resources/META-INF/schemas/geode.incubator.apache.org/lucene/lucene-1.0.xsd
@@ -29,8 +29,14 @@ XML schema for Lucene indexes in Geode.
   </xsd:annotation>
   <xsd:element name="index">
     <xsd:complexType>
+    	<xsd:sequence>
+    	  <xsd:element name="field" maxOccurs="unbounded">
+			<xsd:complexType>
+				<xsd:attribute name="name" type="xsd:string" />
+			</xsd:complexType>
+    	  </xsd:element>
+    	</xsd:sequence>
     	<xsd:attribute name="name" type="xsd:string"/>
-    	<xsd:attribute name="fields" type="xsd:string"/>
     </xsd:complexType>
   </xsd:element>
 </xsd:schema>

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/71cd7c6c/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlGeneratorJUnitTest.java
----------------------------------------------------------------------
diff --git a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlGeneratorJUnitTest.java b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlGeneratorJUnitTest.java
index a31e7e1..3db5d73 100644
--- a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlGeneratorJUnitTest.java
+++ b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlGeneratorJUnitTest.java
@@ -3,6 +3,10 @@ package com.gemstone.gemfire.cache.lucene.internal.xml;
 import static org.junit.Assert.*;
 import static org.mockito.Matchers.*;
 
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.mockito.ArgumentCaptor;
@@ -26,7 +30,8 @@ public class LuceneIndexXmlGeneratorJUnitTest {
   public void generateWithFields() throws SAXException {
     LuceneIndex index = Mockito.mock(LuceneIndex.class);
     Mockito.when(index.getName()).thenReturn("index");
-    Mockito.when(index.getFieldNames()).thenReturn(new String[] {"a", "b"});
+    String[] fields = new String[] {"field1", "field2"};
+    Mockito.when(index.getFieldNames()).thenReturn(fields);
     
     LuceneIndexXmlGenerator generator = new LuceneIndexXmlGenerator(index);
     CacheXmlGenerator cacheXmlGenerator = Mockito.mock(CacheXmlGenerator.class);
@@ -34,11 +39,23 @@ public class LuceneIndexXmlGeneratorJUnitTest {
     Mockito.when(cacheXmlGenerator.getContentHandler()).thenReturn(handler);
     generator.generate(cacheXmlGenerator);
     
-    ArgumentCaptor<Attributes> captor = new ArgumentCaptor<>();
+    ArgumentCaptor<Attributes> captor = ArgumentCaptor.forClass(Attributes.class);
     Mockito.verify(handler).startElement(eq(""), eq("index"), eq("lucene:index"), captor.capture());
     Attributes value = captor.getValue();
     assertEquals("index", value.getValue(LuceneXmlConstants.NAME));
-    assertEquals("a,b", value.getValue(LuceneXmlConstants.FIELDS));
+    
+    captor = ArgumentCaptor.forClass(Attributes.class);
+    Mockito.verify(handler, Mockito.times(2)).startElement(eq(""), eq("field"), eq("lucene:field"), captor.capture());
+    Set<String> foundFields = new HashSet<String>();
+    for(Attributes fieldAttr : captor.getAllValues()) {
+      foundFields.add(fieldAttr.getValue(LuceneXmlConstants.NAME));
+    }
+    
+    HashSet<String> expected = new HashSet<String>(Arrays.asList(fields));
+    assertEquals(expected, foundFields);
+    
+    Mockito.verify(handler, Mockito.times(2)).endElement(eq(""), eq("field"), eq("lucene:field"));
+    Mockito.verify(handler).endElement(eq(""), eq("index"), eq("lucene:index"));
   }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/71cd7c6c/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlParserJUnitTest.java
----------------------------------------------------------------------
diff --git a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlParserJUnitTest.java b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlParserJUnitTest.java
index 808c11e..ff271dd 100644
--- a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlParserJUnitTest.java
+++ b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlParserJUnitTest.java
@@ -28,13 +28,25 @@ public class LuceneIndexXmlParserJUnitTest {
     stack.push(rc);
     parser.setStack(stack);
     XmlGeneratorUtils.addAttribute(attrs, LuceneXmlConstants.NAME, "index");
-    XmlGeneratorUtils.addAttribute(attrs, LuceneXmlConstants.FIELDS, "a,b,c");
     parser.startElement(LuceneXmlConstants.NAMESPACE, LuceneXmlConstants.INDEX, null, attrs);
+    
+    AttributesImpl field1 = new AttributesImpl();
+    XmlGeneratorUtils.addAttribute(field1, LuceneXmlConstants.NAME, "field1");
+    AttributesImpl field2 = new AttributesImpl();
+    XmlGeneratorUtils.addAttribute(field2, LuceneXmlConstants.NAME, "field2");
+    
+    parser.startElement(LuceneXmlConstants.NAMESPACE, LuceneXmlConstants.FIELD, null, field1);
+    parser.endElement(LuceneXmlConstants.NAMESPACE, LuceneXmlConstants.FIELD, null);
+    parser.startElement(LuceneXmlConstants.NAMESPACE, LuceneXmlConstants.FIELD, null, field2);
+    parser.endElement(LuceneXmlConstants.NAMESPACE, LuceneXmlConstants.FIELD, null);
+    
+    
     parser.endElement(LuceneXmlConstants.NAMESPACE, LuceneXmlConstants.INDEX, null);
+    assertEquals(rc, stack.peek());
     
     LuceneIndexCreation index = (LuceneIndexCreation) rc.getExtensionPoint().getExtensions().iterator().next();
     assertEquals("index", index.getName());
-    assertArrayEquals(new String[] {"a", "b", "c"}, index.getFieldNames());
+    assertArrayEquals(new String[] {"field1", "field2"}, index.getFieldNames());
   }
   
 

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/71cd7c6c/gemfire-lucene/src/test/resources/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlParserIntegrationJUnitTest.createIndex.cache.xml
----------------------------------------------------------------------
diff --git a/gemfire-lucene/src/test/resources/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlParserIntegrationJUnitTest.createIndex.cache.xml b/gemfire-lucene/src/test/resources/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlParserIntegrationJUnitTest.createIndex.cache.xml
index 8350650..7f804e0 100644
--- a/gemfire-lucene/src/test/resources/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlParserIntegrationJUnitTest.createIndex.cache.xml
+++ b/gemfire-lucene/src/test/resources/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlParserIntegrationJUnitTest.createIndex.cache.xml
@@ -10,7 +10,15 @@
     version="9.0">
 
 	<region name="region" refid="PARTITION">
-    	<lucene:index name="index1" fields="a, b,c,d"/>
-    	<lucene:index name="index2" fields="f,g"/>
+    	<lucene:index name="index1">
+    	  <lucene:field name="a"/>
+    	  <lucene:field name="b"/>
+    	  <lucene:field name="c"/>
+    	  <lucene:field name="d"/>
+    	</lucene:index>
+    	<lucene:index name="index2">
+    	  <lucene:field name="f"/>
+    	  <lucene:field name="g"/>
+    	</lucene:index>
     </region>    
 </cache>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/71cd7c6c/gemfire-lucene/src/test/resources/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlParserIntegrationJUnitTest.parseIndex.cache.xml
----------------------------------------------------------------------
diff --git a/gemfire-lucene/src/test/resources/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlParserIntegrationJUnitTest.parseIndex.cache.xml b/gemfire-lucene/src/test/resources/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlParserIntegrationJUnitTest.parseIndex.cache.xml
index 8350650..7f804e0 100644
--- a/gemfire-lucene/src/test/resources/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlParserIntegrationJUnitTest.parseIndex.cache.xml
+++ b/gemfire-lucene/src/test/resources/com/gemstone/gemfire/cache/lucene/internal/xml/LuceneIndexXmlParserIntegrationJUnitTest.parseIndex.cache.xml
@@ -10,7 +10,15 @@
     version="9.0">
 
 	<region name="region" refid="PARTITION">
-    	<lucene:index name="index1" fields="a, b,c,d"/>
-    	<lucene:index name="index2" fields="f,g"/>
+    	<lucene:index name="index1">
+    	  <lucene:field name="a"/>
+    	  <lucene:field name="b"/>
+    	  <lucene:field name="c"/>
+    	  <lucene:field name="d"/>
+    	</lucene:index>
+    	<lucene:index name="index2">
+    	  <lucene:field name="f"/>
+    	  <lucene:field name="g"/>
+    	</lucene:index>
     </region>    
 </cache>
\ No newline at end of file