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 <[email protected]> Authored: Thu Oct 8 16:16:56 2015 -0700 Committer: Dan Smith <[email protected]> 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
