{
boolean nodeAutoIndexingEnabled = indexer.isNodeAutoIndexingEnabled(factory.getConnection());
boolean relationshipAutoIndexingEnabled = indexer
.isRelationshipAutoIndexingEnabled(factory.getConnection());
BatchInserter inserter = getBatchInserter();
BatchInserterIndexProvider indexProvider = new LuceneBatchInserterIndexProvider(inserter);
if (inserter == null)
{
log.error("Unable to create instance of BatchInserter. Opertion will fail");
throw new PersistenceException("Unable to create instance of BatchInserter. Opertion will fail");
}
if (resource != null && resource.isActive())
{
log.error("Batch Insertion MUST not be executed in a transaction");
throw new PersistenceException("Batch Insertion MUST not be executed in a transaction");
}
Map<Object, Long> pkToNodeIdMap = new HashMap<Object, Long>();
for (com.impetus.kundera.graph.Node graphNode : nodes)
{
if (graphNode.isDirty())
{
graphNode.handlePreEvent();
// Delete can not be executed in batch, deleting normally
if (graphNode.isInState(RemovedState.class))
{
delete(graphNode.getData(), graphNode.getEntityId());
}
else if (graphNode.isUpdate())
{
// Neo4J allows only batch insertion, follow usual path
// for normal updates
persist(graphNode);
}
else
{
// Insert node
Object entity = graphNode.getData();
EntityMetadata m = KunderaMetadataManager.getEntityMetadata(kunderaMetadata, entity.getClass());
Object pk = PropertyAccessorHelper.getId(entity, m);
Map<String, Object> nodeProperties = mapper.createNodeProperties(entity, m);
long nodeId = inserter.createNode(nodeProperties);
pkToNodeIdMap.put(pk, nodeId);
// Index Node
indexer.indexNodeUsingBatchIndexer(indexProvider, m, nodeId, nodeProperties,
nodeAutoIndexingEnabled);
// Insert relationships for this particular node
if (!getRelationHolders(graphNode).isEmpty())
{
for (RelationHolder rh : getRelationHolders(graphNode))
{
// Search Node (to be connected to ) in Neo4J
// graph
EntityMetadata targetNodeMetadata = KunderaMetadataManager.getEntityMetadata(
kunderaMetadata, rh.getRelationValue().getClass());
Object targetNodeKey = PropertyAccessorHelper.getId(rh.getRelationValue(),
targetNodeMetadata);
Long targetNodeId = pkToNodeIdMap.get(targetNodeKey);
if (targetNodeId != null)
{
/**
* Join this node (source node) to target
* node via relationship
*/
// Relationship Type
DynamicRelationshipType relType = DynamicRelationshipType.withName(rh
.getRelationName());
// Relationship Properties
Map<String, Object> relationshipProperties = null;
Object relationshipObj = rh.getRelationVia();
if (relationshipObj != null)
{
EntityMetadata relationMetadata = KunderaMetadataManager.getEntityMetadata(
kunderaMetadata, relationshipObj.getClass());
relationshipProperties = mapper.createRelationshipProperties(m,
targetNodeMetadata, relationshipObj);
// Finally insert relationship
long relationshipId = inserter.createRelationship(nodeId, targetNodeId,
relType, relationshipProperties);
// Index this relationship
indexer.indexRelationshipUsingBatchIndexer(indexProvider, relationMetadata,
relationshipId, relationshipProperties, relationshipAutoIndexingEnabled);
}
}
}
}
}
graphNode.handlePostEvent();
}
}
// Shutdown Batch inserter
indexProvider.shutdown();
inserter.shutdown();
// Restore Graph Database service
factory.setConnection((GraphDatabaseService) factory.createPoolOrConnection());
return pkToNodeIdMap.size();