public HeterogeneousLuceneSerializer() { final PrimitiveSerializer primitiveSerializer = new PrimitiveSerializer(); SerializerUtil.supportedPrimitiveTypes().stream() .forEach(type -> mappers.put(type, primitiveSerializer)); pdxMapper = new PdxLuceneSerializer(); }
/** * Convert a Apache Geode key into a key search term that can be used to update or delete the * document associated with this key. */ public static Term toKeyTerm(Object key) { if (key instanceof String) { return new Term(KEY_FIELD, (String) key); } else { return new Term(KEY_FIELD, keyToBytes(key)); } }
@Override public Collection<Document> toDocuments(LuceneIndex index, final Object value) { Document doc = new Document(); SerializerUtil.addField(doc, LuceneService.REGION_VALUE_FIELD, value); return Collections.singleton(doc); } }
@Test public void testNullField() { String[] fields = new String[] {"s", "o", "s2"}; ReflectionLuceneSerializer mapper = new ReflectionLuceneSerializer(Type2.class, fields); Type2 type2 = new Type2("a", 1, 2L, 3.0, 4.0f, null); Document doc = invokeSerializer(mapper, type2, fields); assertEquals(1, doc.getFields().size()); assertEquals("a", doc.getField("s").stringValue()); assertNull(doc.getField("s2")); } }
@Test public void testAllFields() { String[] allFields = new String[] {"s", "i", "l", "d", "f", "s2"}; ReflectionLuceneSerializer mapper1 = new ReflectionLuceneSerializer(Type1.class, allFields); ReflectionLuceneSerializer mapper2 = new ReflectionLuceneSerializer(Type2.class, allFields); Type1 type1 = new Type1("a", 1, 2L, 3.0, 4.0f); Type2 type2 = new Type2("a", 1, 2L, 3.0, 4.0f, "b"); Document doc1 = invokeSerializer(mapper1, type1, allFields); assertEquals(5, doc1.getFields().size()); assertEquals("a", doc1.getField("s").stringValue()); assertEquals(1, doc1.getField("i").numericValue()); assertEquals(2L, doc1.getField("l").numericValue()); assertEquals(3.0, doc1.getField("d").numericValue()); assertEquals(4.0f, doc1.getField("f").numericValue()); Document doc2 = invokeSerializer(mapper2, type2, allFields); assertEquals(6, doc2.getFields().size()); assertEquals("a", doc2.getField("s").stringValue()); assertEquals("b", doc2.getField("s2").stringValue()); assertEquals(1, doc2.getField("i").numericValue()); assertEquals(2L, doc2.getField("l").numericValue()); assertEquals(3.0, doc2.getField("d").numericValue()); assertEquals(4.0f, doc2.getField("f").numericValue()); }
public void testHeterogeneousObjects() { String[] fields = new String[] {"s", "i", "l", "d", "f", "s2", "missing"}; HeterogeneousLuceneSerializer mapper = new HeterogeneousLuceneSerializer(); Type1 t1 = new Type1("a", 1, 2L, 3.0, 4.0f); Document doc1 = SerializerTestHelper.invokeSerializer(mapper, t1, fields); assertEquals(4.0f, doc1.getField("f").numericValue()); Type2 t2 = new Type2("a", 1, 2L, 3.0, 4.0f, "b"); Document doc2 = SerializerTestHelper.invokeSerializer(mapper, t2, fields); when(pdxInstance.getField("i")).thenReturn(5); Document doc3 = SerializerTestHelper.invokeSerializer(mapper, pdxInstance, fields);
@Test public void shouldIndexPrimitiveStringIfRequested() { HeterogeneousLuceneSerializer mapper = new HeterogeneousLuceneSerializer(); Document doc = SerializerTestHelper.invokeSerializer(mapper, "sample value", new String[] {LuceneService.REGION_VALUE_FIELD}); assertEquals(1, doc.getFields().size()); assertEquals("sample value", doc.getField(LuceneService.REGION_VALUE_FIELD).stringValue()); }
@Test public void testWriteFields() { String[] fields = new String[] {"s", "i"}; PdxLuceneSerializer mapper = new PdxLuceneSerializer(); PdxInstance pdxInstance = mock(PdxInstance.class); when(pdxInstance.hasField("s")).thenReturn(true); when(pdxInstance.hasField("i")).thenReturn(true); when(pdxInstance.getField("s")).thenReturn("a"); when(pdxInstance.getField("i")).thenReturn(5); Document doc = invokeSerializer(mapper, pdxInstance, fields); assertEquals(2, doc.getFields().size()); assertEquals("a", doc.getField("s").stringValue()); assertEquals(5, doc.getField("i").numericValue()); }
@Override protected RepositoryManager createRepositoryManager(LuceneSerializer luceneSerializer) { LuceneSerializer mapper = luceneSerializer; if (mapper == null) { mapper = new HeterogeneousLuceneSerializer(); } PartitionedRepositoryManager partitionedRepositoryManager = new PartitionedRepositoryManager(this, mapper, this.waitingThreadPoolFromDM); return partitionedRepositoryManager; }
/** * Get the field mapper based on the type of the given object. */ private LuceneSerializer getFieldMapper(Object value, String[] indexedFields) { if (value instanceof PdxInstance) { return pdxMapper; } else { Class<?> clazz = value.getClass(); LuceneSerializer mapper = mappers.get(clazz); if (mapper == null) { mapper = new ReflectionLuceneSerializer(clazz, indexedFields); mappers.put(clazz, mapper); } return mapper; } }
@Override public Collection<Document> toDocuments(LuceneIndex index, Object value) { if (value == null) { return Collections.emptyList(); } LuceneSerializer mapper = getFieldMapper(value, index.getFieldNames()); Collection<Document> docs = mapper.toDocuments(index, value); if (logger.isDebugEnabled()) { logger.debug("HeterogeneousLuceneSerializer.toDocuments:" + docs); } return docs; }
@Override public void delete(Object key) throws IOException { long start = stats.startUpdate(); try { Term keyTerm = SerializerUtil.toKeyTerm(key); writer.deleteDocuments(keyTerm); } finally { stats.endUpdate(start); } }
/** * Extract the Apache Geode key from a lucene document */ public static Object getKey(Document doc) { IndexableField field = doc.getField(KEY_FIELD); if (field.stringValue() != null) { return field.stringValue(); } else { return keyFromBytes(field.binaryValue()); } }
@Test public void testIgnoreInvalid() { String[] fields = new String[] {"s", "o", "s2"}; ReflectionLuceneSerializer mapper = new ReflectionLuceneSerializer(Type2.class, fields); Type2 type2 = new Type2("a", 1, 2L, 3.0, 4.0f, "b"); Document doc = invokeSerializer(mapper, type2, fields); assertEquals(2, doc.getFields().size()); assertEquals("a", doc.getField("s").stringValue()); assertEquals("b", doc.getField("s2").stringValue()); }
@Test public void shouldIndexPrimitiveNumberIfRequested() { HeterogeneousLuceneSerializer mapper = new HeterogeneousLuceneSerializer(); Document doc = SerializerTestHelper.invokeSerializer(mapper, 53, new String[] {LuceneService.REGION_VALUE_FIELD}); assertEquals(1, doc.getFields().size()); assertEquals(53, doc.getField(LuceneService.REGION_VALUE_FIELD).numericValue()); }
@Test public void testNullField() { String[] fields = new String[] {"s", "i"}; PdxLuceneSerializer mapper = new PdxLuceneSerializer(); PdxInstance pdxInstance = mock(PdxInstance.class); when(pdxInstance.hasField("s")).thenReturn(true); when(pdxInstance.hasField("i")).thenReturn(true); when(pdxInstance.getField("s")).thenReturn("a"); when(pdxInstance.getField("i")).thenReturn(null); Document doc = invokeSerializer(mapper, pdxInstance, fields); assertEquals(1, doc.getFields().size()); assertEquals("a", doc.getField("s").stringValue()); assertNull(doc.getField("i")); } }
private LuceneIndexCreationProfile getHeterogeneousLuceneSerializerCreationProfile() { return new LuceneIndexCreationProfile(INDEX_NAME, REGION_NAME, new String[] {"field1"}, new StandardAnalyzer(), null, new HeterogeneousLuceneSerializer()); }
/** * Add a Apache Geode key to a document */ public static void addKey(Object key, Document doc) { if (key instanceof String) { doc.add(new StringField(KEY_FIELD, (String) key, Store.YES)); } else { doc.add(new StringField(KEY_FIELD, keyToBytes(key), Store.YES)); } }
private void addFieldValueForNonCollectionObject(Document doc, String indexedFieldName, Object fieldValue, List<String> tokenizedFields) { if (tokenizedFields.size() == 1) { SerializerUtil.addField(doc, indexedFieldName, fieldValue); } else { addFieldValue(doc, indexedFieldName, fieldValue, tokenizedFields.subList(1, tokenizedFields.size())); } }
@Override protected RepositoryManager createRepositoryManager(LuceneSerializer luceneSerializer) { HeterogeneousLuceneSerializer mapper = (HeterogeneousLuceneSerializer) luceneSerializer; if (mapper == null) { mapper = new HeterogeneousLuceneSerializer(); } RawLuceneRepositoryManager rawLuceneRepositoryManager = new RawLuceneRepositoryManager(this, mapper, cache.getDistributionManager().getWaitingThreadPool()); return rawLuceneRepositoryManager; }