Skip to content

Commit

Permalink
Avoid allocating whole documents when populating the fulltext index a…
Browse files Browse the repository at this point in the history
…dd-on.

Allocate document factory closures instead, so a single document can be reused.
  • Loading branch information
chrisvest committed Sep 20, 2017
1 parent 5dba019 commit 41b408d
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 14 deletions.
Expand Up @@ -48,7 +48,6 @@
import org.neo4j.logging.Log;
import org.neo4j.scheduler.JobScheduler;

import static org.neo4j.kernel.api.impl.fulltext.LuceneFulltextDocumentStructure.documentForPopulation;
import static org.neo4j.kernel.api.impl.fulltext.LuceneFulltextDocumentStructure.documentRepresentingProperties;
import static org.neo4j.kernel.api.impl.fulltext.LuceneFulltextDocumentStructure.newTermForChangeOrRemove;

Expand Down Expand Up @@ -165,7 +164,7 @@ private AsyncFulltextIndexOperation enqueuePopulateIndex(
{
PartitionedIndexWriter indexWriter = index.getIndexWriter();
String[] indexedPropertyKeys = index.properties().toArray( new String[0] );
ArrayList<Document> documents = new ArrayList<>();
ArrayList<Supplier<Document>> documents = new ArrayList<>();
try ( Transaction ignore = db.beginTx( 1, TimeUnit.DAYS ) )
{
ResourceIterable<? extends Entity> entities = entitySupplier.get();
Expand All @@ -175,24 +174,34 @@ private AsyncFulltextIndexOperation enqueuePopulateIndex(
Map<String,Object> properties = entity.getProperties( indexedPropertyKeys );
if ( !properties.isEmpty() )
{
documents.add( documentForPopulation( entityId, properties ) );
documents.add( documentBuilder( entityId, properties ) );
}

if ( documents.size() > POPULATING_BATCH_SIZE )
{
indexWriter.addDocuments( documents.size(), documents );
indexWriter.addDocuments( documents.size(), reifyDocuments( documents ) );
documents.clear();
}
}
}
indexWriter.addDocuments( documents.size(), documents );
indexWriter.addDocuments( documents.size(), reifyDocuments( documents ) );
return Pair.of( index, completedLatch );
};

enqueueUpdate( population );
return completedLatch;
}

private Supplier<Document> documentBuilder( long entityId, Map<String,Object> properties )
{
return () -> documentRepresentingProperties( entityId, properties );
}

private Iterable<Document> reifyDocuments( ArrayList<Supplier<Document>> documents )
{
return () -> documents.stream().map( Supplier::get ).iterator();
}

private void enqueueUpdate( FulltextIndexUpdate update ) throws IOException
{
try
Expand Down
Expand Up @@ -36,7 +36,6 @@

class LuceneFulltextDocumentStructure
{

private static final ThreadLocal<DocWithId> perThreadDocument = ThreadLocal.withInitial( DocWithId::new );

private LuceneFulltextDocumentStructure()
Expand All @@ -62,14 +61,6 @@ static Field encodeValueField( String propertyKey, Value value )
return LuceneFulltextFieldEncoding.encodeField( propertyKey, value );
}

public static Document documentForPopulation( long entityId, Map<String,Object> properties )
{
DocWithId docWithId = new DocWithId();
docWithId.setId( entityId );
docWithId.setValues( properties );
return docWithId.document;
}

private static class DocWithId
{
private final Document document;
Expand Down

0 comments on commit 41b408d

Please sign in to comment.