private IndexEntryUpdate<?> change( long nodeId, Object oldValue, Object newValue ) { return IndexQueryHelper.change( nodeId, index.schema(), oldValue, newValue ); }
private IndexEntryUpdate<?> change( long nodeId, Object valueBefore, Object valueAfter ) { return IndexQueryHelper.change( nodeId, index.schema(), valueBefore, valueAfter ); }
private IndexEntryUpdate<?> change( long nodeId, Object[] valuesBefore, Object[] valuesAfter ) { return IndexQueryHelper.change( nodeId, SCHEMA_INDEX_DESCRIPTOR.schema(), valuesBefore, valuesAfter ); }
private IndexEntryUpdate<?> change( long nodeId, Object valueBefore, Object valueAfter ) { return IndexQueryHelper.change( nodeId, index.schema(), valueBefore, valueAfter ); }
@Test void closeVerifiesUniquenessOfChangedValues() throws Exception { SchemaIndex index = mock( SchemaIndex.class ); UniqueLuceneIndexPopulatingUpdater updater = newUpdater( index ); updater.process( change( 1, descriptor, "foo1", "foo2" ) ); updater.process( change( 1, descriptor, "bar1", "bar2" ) ); updater.process( change( 1, descriptor, "baz1", "baz2" ) ); verifyZeroInteractions( index ); updater.close(); verifyVerifyUniqueness( index, descriptor, "foo2", "bar2", "baz2" ); }
@Test void changedNodePropertiesDoNotInfluenceSample() throws Exception { UniqueIndexSampler sampler = new UniqueIndexSampler(); UniqueLuceneIndexPopulatingUpdater updater = newUpdater( sampler ); updater.process( change( 1, descriptor, "before1", "after1" ) ); updater.process( change( 2, descriptor, "before2", "after2" ) ); verifySamplingResult( sampler, 0 ); }
@Test void changesDeliveredToIndexWriter() throws Exception { LuceneIndexWriter writer = mock( LuceneIndexWriter.class ); UniqueLuceneIndexPopulatingUpdater updater = newUpdater( writer ); updater.process( change( 1, descriptor, "before1", "after1" ) ); updater.process( change( 2, descriptor, "before2", "after2" ) ); verify( writer ).updateDocument( newTermForChangeOrRemove( 1 ), documentRepresentingProperties( (long) 1, "after1" ) ); verify( writer ).updateDocument( newTermForChangeOrRemove( 2 ), documentRepresentingProperties( (long) 2, "after2" ) ); }
@Test void closeVerifiesUniquenessOfAddedAndChangedValues() throws Exception { SchemaIndex index = mock( SchemaIndex.class ); UniqueLuceneIndexPopulatingUpdater updater = newUpdater( index ); updater.process( add( 1, descriptor, "added1" ) ); updater.process( add( 2, descriptor, "added2" ) ); updater.process( change( 3, descriptor, "before1", "after1" ) ); updater.process( change( 4, descriptor, "before2", "after2" ) ); updater.process( remove( 5, descriptor, "removed1" ) ); verifyZeroInteractions( index ); updater.close(); verifyVerifyUniqueness( index, descriptor, "added1", "added2", "after1", "after2" ); }
@Test public void shouldBeAbleToHandleSwappingOfIndexValues() throws Exception { // given populator = newPopulator(); addUpdate( populator, 1, "value1" ); addUpdate( populator, 2, "value2" ); // when IndexUpdater updater = populator.newPopulatingUpdater( nodePropertyAccessor ); updater.process( change( 1, schemaDescriptor, "value1", "value2" ) ); updater.process( change( 2, schemaDescriptor, "value2", "value1" ) ); populator.close( true ); // then assertEquals( asList( 2L ), getAllNodes( getDirectory(), "value1" ) ); assertEquals( asList( 1L ), getAllNodes( getDirectory(), "value2" ) ); }
@Test void changesDeliveredToIndexWriter() throws Exception { LuceneIndexWriter writer = mock( LuceneIndexWriter.class ); NonUniqueLuceneIndexPopulatingUpdater updater = newUpdater( writer ); String expectedString1 = documentRepresentingProperties( 1, "after1" ).toString(); String expectedString2 = documentRepresentingProperties( 2, "after2" ).toString(); String expectedString3 = documentRepresentingProperties( 3, "bit", "after2" ).toString(); updater.process( change( 1, SCHEMA_DESCRIPTOR, "before1", "after1" ) ); verifydocument( writer, newTermForChangeOrRemove( 1 ), expectedString1 ); updater.process( change( 2, SCHEMA_DESCRIPTOR, "before2", "after2" ) ); verifydocument( writer, newTermForChangeOrRemove( 2 ), expectedString2 ); updater.process( change( 3, COMPOSITE_SCHEMA_DESCRIPTOR, new Object[]{"bit", "before2"}, new Object[]{"bit", "after2"} ) ); verifydocument( writer, newTermForChangeOrRemove( 3 ), expectedString3 ); }
@Test void changedNodePropertiesIncludedInSample() throws Exception { NonUniqueIndexSampler sampler = newSampler(); NonUniqueLuceneIndexPopulatingUpdater updater = newUpdater( sampler ); updater.process( add( 1, SCHEMA_DESCRIPTOR, "initial1" ) ); updater.process( add( 2, SCHEMA_DESCRIPTOR, "initial2" ) ); updater.process( add( 3, SCHEMA_DESCRIPTOR, "new2" ) ); updater.process( change( 1, SCHEMA_DESCRIPTOR, "initial1", "new1" ) ); updater.process( change( 1, SCHEMA_DESCRIPTOR, "initial2", "new2" ) ); verifySamplingResult( sampler, 3, 2, 3 ); }
@Test void changedNodeCompositePropertiesIncludedInSample() throws Exception { NonUniqueIndexSampler sampler = newSampler(); NonUniqueLuceneIndexPopulatingUpdater updater = newUpdater( sampler ); updater.process( add( 1, COMPOSITE_SCHEMA_DESCRIPTOR, "bit", "initial1" ) ); updater.process( add( 2, COMPOSITE_SCHEMA_DESCRIPTOR, "bit", "initial2" ) ); updater.process( add( 3, COMPOSITE_SCHEMA_DESCRIPTOR, "bit", "new2" ) ); updater.process( change( 1, COMPOSITE_SCHEMA_DESCRIPTOR, new Object[]{"bit", "initial1"}, new Object[]{"bit", "new1"} ) ); updater.process( change( 1, COMPOSITE_SCHEMA_DESCRIPTOR, new Object[]{"bit", "initial2"}, new Object[]{"bit", "new2"} ) ); verifySamplingResult( sampler, 3, 2, 3 ); }
@Test public void shouldUpdateEntryForNodeThatHasAlreadyBeenIndexed() throws Exception { // given populator = newPopulator(); addUpdate( populator, 1, "value1" ); // when IndexUpdater updater = populator.newPopulatingUpdater( nodePropertyAccessor ); updater.process( change( 1, schemaDescriptor, "value1", "value2" ) ); populator.close( true ); // then assertEquals( Collections.EMPTY_LIST, getAllNodes( getDirectory(), "value1" ) ); assertEquals( asList( 1L ), getAllNodes( getDirectory(), "value2" ) ); }
@Test public void shouldNotRejectDuplicateEntryOnSameNodeIdAfterUsingPopulatingUpdater() throws Exception { // given populator = newPopulator(); when( nodePropertyAccessor.getNodePropertyValue( 1, PROPERTY_KEY_ID ) ).thenReturn( Values.of( "value1" ) ); IndexUpdater updater = populator.newPopulatingUpdater( nodePropertyAccessor ); updater.process( add( 1, schemaDescriptor, "value1" ) ); updater.process( change( 1, schemaDescriptor, "value1", "value1" ) ); updater.close(); addUpdate( populator, 2, "value2" ); addUpdate( populator, 3, "value3" ); // when populator.verifyDeferredConstraints( nodePropertyAccessor ); populator.close( true ); // then assertEquals( asList( 1L ), getAllNodes( getDirectory(), "value1" ) ); assertEquals( asList( 2L ), getAllNodes( getDirectory(), "value2" ) ); assertEquals( asList( 3L ), getAllNodes( getDirectory(), "value3" ) ); }
@Test void nodePropertyUpdatesIncludedInSample() throws Exception { UniqueIndexSampler sampler = new UniqueIndexSampler(); UniqueLuceneIndexPopulatingUpdater updater = newUpdater( sampler ); updater.process( add( 1, descriptor, "foo" ) ); updater.process( change( 1, descriptor, "foo", "bar" ) ); updater.process( add( 2, descriptor, "baz" ) ); updater.process( add( 3, descriptor, "qux" ) ); updater.process( remove( 4, descriptor, "qux" ) ); verifySamplingResult( sampler, 2 ); }
@Test void nodePropertyUpdatesIncludedInSample() throws Exception { NonUniqueIndexSampler sampler = newSampler(); NonUniqueLuceneIndexPopulatingUpdater updater = newUpdater( sampler ); updater.process( add( 1, SCHEMA_DESCRIPTOR, "foo" ) ); updater.process( change( 1, SCHEMA_DESCRIPTOR, "foo", "newFoo1" ) ); updater.process( add( 2, SCHEMA_DESCRIPTOR, "bar" ) ); updater.process( remove( 2, SCHEMA_DESCRIPTOR, "bar" ) ); updater.process( change( 1, SCHEMA_DESCRIPTOR, "newFoo1", "newFoo2" ) ); updater.process( add( 42, SCHEMA_DESCRIPTOR, "qux" ) ); updater.process( add( 3, SCHEMA_DESCRIPTOR, "bar" ) ); updater.process( add( 4, SCHEMA_DESCRIPTOR, "baz" ) ); updater.process( add( 5, SCHEMA_DESCRIPTOR, "bar" ) ); updater.process( remove( 42, SCHEMA_DESCRIPTOR, "qux" ) ); verifySamplingResult( sampler, 4, 3, 4 ); }
@Test void nodeCompositePropertyUpdatesIncludedInSample() throws Exception { NonUniqueIndexSampler sampler = newSampler(); NonUniqueLuceneIndexPopulatingUpdater updater = newUpdater( sampler ); updater.process( add( 1, COMPOSITE_SCHEMA_DESCRIPTOR, "bit", "foo" ) ); updater.process( change( 1, COMPOSITE_SCHEMA_DESCRIPTOR, new Object[]{"bit", "foo"}, new Object[]{"bit", "newFoo1"} ) ); updater.process( add( 2, COMPOSITE_SCHEMA_DESCRIPTOR, "bit", "bar" ) ); updater.process( remove( 2, COMPOSITE_SCHEMA_DESCRIPTOR, "bit", "bar" ) ); updater.process( change( 1, COMPOSITE_SCHEMA_DESCRIPTOR, new Object[]{"bit", "newFoo1"}, new Object[]{"bit", "newFoo2"} ) ); updater.process( add( 42, COMPOSITE_SCHEMA_DESCRIPTOR, "bit", "qux" ) ); updater.process( add( 3, COMPOSITE_SCHEMA_DESCRIPTOR, "bit", "bar" ) ); updater.process( add( 4, COMPOSITE_SCHEMA_DESCRIPTOR, "bit", "baz" ) ); updater.process( add( 5, COMPOSITE_SCHEMA_DESCRIPTOR, "bit", "bar" ) ); updater.process( remove( 42, COMPOSITE_SCHEMA_DESCRIPTOR, "bit", "qux" ) ); verifySamplingResult( sampler, 4, 3, 4 ); }