/*******************************************************************************
* Copyright (c) 2008 Cambridge Semantics Incorporated.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* File: $Source$
* Created by: Matthew Roy ( <a href="mailto:mroy@cambridgesemantics.com">mroy@cambridgesemantics.com </a>)
* Created on: Jan 18, 2008
* Revision: $Id$
*
* Contributors:
* Cambridge Semantics Incorporated - initial API and implementation
*******************************************************************************/
package org.openanzo.datasource.nodecentric.operations;
import java.text.MessageFormat;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import org.openanzo.datasource.IStoredNamedGraph;
import org.openanzo.datasource.nodecentric.internal.NodeCentricDatasource;
import org.openanzo.datasource.nodecentric.internal.NodeCentricOperationContext;
import org.openanzo.datasource.nodecentric.sql.InsertStatementsRdbWrapper;
import org.openanzo.datasource.nodecentric.sql.InsertStatementsRdbWrapper.SelectInsertStatementsResult;
import org.openanzo.datasource.update.UpdateChanges;
import org.openanzo.exceptions.AnzoException;
import org.openanzo.exceptions.ExceptionConstants;
import org.openanzo.exceptions.LogUtils;
import org.openanzo.jdbc.container.sql.BaseSQL;
import org.openanzo.jdbc.utils.ClosableIterator;
import org.openanzo.jdbc.utils.RdbException;
import org.openanzo.rdf.Statement;
import org.openanzo.rdf.URI;
import org.openanzo.rdf.Value;
import org.openanzo.rdf.Constants.GRAPHS;
import org.openanzo.rdf.Constants.NAMESPACES;
import org.openanzo.rdf.utils.UriGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Matthew Roy ( <a href="mailto:mroy@cambridgesemantics.com">mroy@cambridgesemantics.com </a>)
*
*/
public class Update {
private static final Logger log = LoggerFactory.getLogger(Update.class);
private static final String STMTS_TMP = "STMTS_TMP";
/**
* Update statements in database
*
* @param context
* context for operation
* @param transactionId
* id of transaction
* @param namedGraphs
* namedgraphs to store
* @param additions
* statements to add
* @param deletions
* statements to remove
* @param storedNodes
* resolved values to ids
* @param insertDirect
* stand alone insert that does not need 2 stage committed insert
* @return the updates
* @throws AnzoException
*/
static public UpdateChanges update(NodeCentricOperationContext context, Long transactionId, Map<URI, IStoredNamedGraph> namedGraphs, Collection<Statement> additions, Collection<Statement> deletions, Map<Value, Long> storedNodes, boolean insertDirect) throws AnzoException {
UpdateChanges updateResults = new UpdateChanges();
if ((additions == null || additions.size() == 0) && (deletions == null || deletions.size() == 0))
return updateResults;
int countA = 0;
int countR = 0;
long startOverall = System.currentTimeMillis();
long start = System.currentTimeMillis();
Statement[] additionsArray = (additions != null) ? new HashSet<Statement>(additions).toArray(new Statement[0]) : null;
long middle = System.currentTimeMillis();
try {
int adds = 0;
if (additions != null && additions.size() > 0)
adds = insert(context, (insertDirect ? 0 : transactionId), namedGraphs, additionsArray, storedNodes);
Statement[] removalsArray = (deletions != null) ? new HashSet<Statement>(deletions).toArray(new Statement[0]) : null;
int removes = 0;
if (deletions != null && deletions.size() > 0)
removes = remove(context, -1 * transactionId, namedGraphs, removalsArray);
middle = System.currentTimeMillis();
start = middle;
if (adds > 0 && removes > 0) {
int pis = InsertStatementsRdbWrapper.purgeInsertRemoveStatements(context.getStatementProvider(), context.getConnection(), context.getConfiguration().getSessionPrefix());
middle = System.currentTimeMillis();
if (log.isDebugEnabled())
log.debug(LogUtils.RDB_MARKER, "[PURGE ADD/REMOVE STATEMENTS] {}:{}", Integer.toString(pis), Long.toString((middle - start)));
}
if (adds > 0) {
int pis = InsertStatementsRdbWrapper.purgeInsertStatements(context.getStatementProvider(), context.getConnection(), context.getConfiguration().getSessionPrefix());
adds = adds - pis;
middle = System.currentTimeMillis();
if (log.isDebugEnabled())
log.debug(LogUtils.RDB_MARKER, "[PURGE EXISTING STATEMENTS] {}:{}", Integer.toString(pis), Long.toString((middle - start)));
}
start = middle;
if (removes > 0) {
int prs = InsertStatementsRdbWrapper.purgeRemoveStatements(context.getStatementProvider(), context.getConnection(), context.getConfiguration().getSessionPrefix());
middle = System.currentTimeMillis();
if (log.isDebugEnabled())
log.debug(LogUtils.RDB_MARKER, "[PURGE NONEXISTING REMOVES] {}:{}", Integer.toString(prs), Long.toString((middle - start)));
removes = removes - prs;
start = System.currentTimeMillis();
if (removes > 0) {
if (context.getConfiguration().getLimitTransactionSize() && removalsArray.length > NodeCentricDatasource.MAX_OPERATION_SIZE) {
for (int i = 0; (i * NodeCentricDatasource.MAX_OPERATION_SIZE) <= removalsArray.length; i++) {
int offset = (i * NodeCentricDatasource.MAX_OPERATION_SIZE);
int max = Math.min(offset + NodeCentricDatasource.MAX_OPERATION_SIZE, removalsArray.length);
start = System.currentTimeMillis();
int count = InsertStatementsRdbWrapper.commitRemoveStatementsRange(context.getStatementProvider(), context.getConnection(), -1 * transactionId, offset, max, context.getConfiguration().getSessionPrefix());
countR += count;
middle = System.currentTimeMillis();
if (log.isDebugEnabled())
log.debug(LogUtils.RDB_MARKER, "[COMMIT REMOVED STATEMENTS RANGE {}-{}] {}:{}", new Object[] { Integer.toString(offset), Integer.toString(max), Long.toString(count), Long.toString((middle - start)) });
}
} else {
countR = InsertStatementsRdbWrapper.commitRemoveStatements(context.getStatementProvider(), context.getConnection(), -1 * transactionId, context.getConfiguration().getSessionPrefix());
middle = System.currentTimeMillis();
if (log.isDebugEnabled())
log.debug(LogUtils.RDB_MARKER, "[COMMIT REMOVED STATEMENTS] {}:{}", Long.toString(countR), Long.toString((middle - start)));
}
}
}
start = System.currentTimeMillis();
if (adds > 0) {
if (context.getConfiguration().getLimitTransactionSize() && additionsArray.length > NodeCentricDatasource.MAX_OPERATION_SIZE) {
for (int i = 0; (i * NodeCentricDatasource.MAX_OPERATION_SIZE) <= additionsArray.length; i++) {
int offset = (i * NodeCentricDatasource.MAX_OPERATION_SIZE);
int max = Math.min(offset + NodeCentricDatasource.MAX_OPERATION_SIZE, additionsArray.length);
start = System.currentTimeMillis();
long count = InsertStatementsRdbWrapper.commitInsertStatementsRange(context.getStatementProvider(), context.getConnection(), offset, max, context.getConfiguration().getSessionPrefix());
countA += count;
middle = System.currentTimeMillis();
if (log.isDebugEnabled())
log.debug(LogUtils.RDB_MARKER, "[COMMIT INSERTED STATEMENTS RANGE {}-{}] {}:{}", new Object[] { Integer.toString(offset), Integer.toString(max), Long.toString(count), Long.toString((middle - start)) });
}
} else {
countA = InsertStatementsRdbWrapper.commitInsertStatements(context.getStatementProvider(), context.getConnection(), context.getConfiguration().getSessionPrefix());
middle = System.currentTimeMillis();
if (log.isDebugEnabled())
log.debug(LogUtils.RDB_MARKER, "[COMMIT INSERTED STATEMENTS] {}:{}", Long.toString(countA), Long.toString((middle - start)));
}
}
start = middle;
ClosableIterator<SelectInsertStatementsResult> results = null;
try {
results = InsertStatementsRdbWrapper.selectInsertStatements(context.getStatementProvider(), context.getConnection(), context.getConfiguration().getSessionPrefix());
middle = System.currentTimeMillis();
if (log.isDebugEnabled()) {
log.debug(LogUtils.RDB_MARKER, "[SELECT UPDATED STATEMENTS] {}", Long.toString((middle - start)));
}
start = middle;
while (results.hasNext()) {
SelectInsertStatementsResult result = results.next();
int id = result.getStmtId();
if (result.getOperation() == 1) {
URI ngURI = additionsArray[id].getNamedGraphUri();
if (!ngURI.equals(GRAPHS.GRAPHS_DATASET) && !ngURI.equals(GRAPHS.METADATA_GRAPHS_DATASET)) {
updateResults.namedGraphs.add(namedGraphs.get(ngURI));
}
updateResults.addedStatements.add(additionsArray[id]);
} else {
URI ngURI = removalsArray[id].getNamedGraphUri();
if (!ngURI.equals(GRAPHS.GRAPHS_DATASET) && !ngURI.equals(GRAPHS.METADATA_GRAPHS_DATASET)) {
updateResults.namedGraphs.add(namedGraphs.get(ngURI));
}
updateResults.removedStatements.add(removalsArray[id]);
}
}
} finally {
if (results != null)
results.close();
}
middle = System.currentTimeMillis();
if (log.isDebugEnabled()) {
log.debug(LogUtils.RDB_MARKER, "[RESOLVE UPDATED STATEMENTS] {}", Long.toString((middle - start)));
}
start = middle;
InsertStatementsRdbWrapper.commitStatementIds(context.getStatementProvider(), context.getConnection(), context.getConfiguration().getSessionPrefix());
} finally {
BaseSQL.truncateTableWithSessionMayCommit(context.getStatementProvider(), context.getConnection(), context.getConfiguration().getSessionPrefix(), STMTS_TMP);
}
middle = System.currentTimeMillis();
if (log.isDebugEnabled()) {
log.debug(LogUtils.RDB_MARKER, "[DELETE TEMP STATEMENTS] {}", Long.toString((middle - start)));
}
long totalTime = (System.currentTimeMillis() - startOverall);
if (log.isDebugEnabled()) {
log.debug(LogUtils.RDB_MARKER, "[STORED] {}:{}:{} Q/ms:{} ms/Q", new Object[] { Long.toString(countA), Long.toString(totalTime), Long.toString((countA / (totalTime + 1))), Long.toString((totalTime / (countA + 1))) });
}
return updateResults;
}
/**
* Update statements in database
*
* @param context
* context for operation
* @param transactionId
* id of transaction
* @param namedGraphs
* namedgraphs to store
* @param additions
* statements to add
* @param deletions
* statements to remove
* @param storedNodes
* resolved values to ids
* @param insertDirect
* stand alone insert that does not need 2 stage committed insert
* @return the updates
* @throws AnzoException
*/
static public UpdateChanges updateNR(NodeCentricOperationContext context, Long transactionId, Map<URI, IStoredNamedGraph> namedGraphs, Collection<Statement> additions, Collection<Statement> deletions, Map<Value, Long> storedNodes, boolean insertDirect) throws AnzoException {
UpdateChanges updateResults = new UpdateChanges();
if ((additions == null || additions.size() == 0) && (deletions == null || deletions.size() == 0))
return updateResults;
int countA = 0;
int countR = 0;
long startOverall = System.currentTimeMillis();
long start = System.currentTimeMillis();
Statement[] additionsArray = (additions != null) ? new HashSet<Statement>(additions).toArray(new Statement[0]) : null;
int adds = 0;
if (additions != null && additions.size() > 0)
adds = insert(context, insertDirect ? 0 : transactionId, namedGraphs, additionsArray, storedNodes);
Statement[] removalsArray = (deletions != null) ? new HashSet<Statement>(deletions).toArray(new Statement[0]) : null;
int removes = 0;
if (deletions != null && deletions.size() > 0)
removes = remove(context, (-1 * transactionId), namedGraphs, removalsArray);
long middle = System.currentTimeMillis();
long pis = 0;
if (adds > 0) {
pis = InsertStatementsRdbWrapper.purgeInsertStatementsNR(context.getStatementProvider(), context.getConnection(), context.getConfiguration().getSessionPrefix());
if (log.isDebugEnabled())
log.debug(LogUtils.RDB_MARKER, "[PURGE EXISTING STATEMENTS_NR] {}:{}", Long.toString(pis), Long.toString((middle - start)));
start = middle;
}
long prs = 0;
if (removes > 0) {
prs = InsertStatementsRdbWrapper.purgeRemoveStatementsNR(context.getStatementProvider(), context.getConnection(), context.getConfiguration().getSessionPrefix());
middle = System.currentTimeMillis();
if (log.isDebugEnabled())
log.debug(LogUtils.RDB_MARKER, "[PURGE NONEXISTING REMOVES_NR] {}:{}", Long.toString(prs), Long.toString((middle - start)));
start = System.currentTimeMillis();
if (removes - prs > 0) {
countR = InsertStatementsRdbWrapper.commitRemoveStatementsNR(context.getStatementProvider(), context.getConnection(), (-1 * transactionId), context.getConfiguration().getSessionPrefix());
middle = System.currentTimeMillis();
if (log.isDebugEnabled())
log.debug(LogUtils.RDB_MARKER, "[COMMIT REMOVED STATEMENTS_NR] {}:{}", Long.toString(countR), Long.toString((middle - start)));
}
}
if (adds - pis > 0) {
start = System.currentTimeMillis();
countA = InsertStatementsRdbWrapper.commitInsertStatementsNR(context.getStatementProvider(), context.getConnection(), context.getConfiguration().getSessionPrefix());
middle = System.currentTimeMillis();
if (log.isDebugEnabled())
log.debug(LogUtils.RDB_MARKER, "[COMMIT INSERTED STATEMENTS_NR] {}:{}", Long.toString(countA), Long.toString((middle - start)));
start = middle;
}
if (countA + countR > 0) {
ClosableIterator<SelectInsertStatementsResult> results = null;
try {
results = InsertStatementsRdbWrapper.selectInsertStatements(context.getStatementProvider(), context.getConnection(), context.getConfiguration().getSessionPrefix());
middle = System.currentTimeMillis();
if (log.isDebugEnabled()) {
log.debug(LogUtils.RDB_MARKER, "[SELECT UPDATED STATEMENTS_NR] {}", Long.toString((middle - start)));
}
start = middle;
while (results.hasNext()) {
SelectInsertStatementsResult result = results.next();
int id = result.getStmtId();
if (result.getOperation() == 1) {
URI ngURI = additionsArray[id].getNamedGraphUri();
if (!ngURI.equals(GRAPHS.GRAPHS_DATASET) && !ngURI.equals(GRAPHS.METADATA_GRAPHS_DATASET)) {
updateResults.namedGraphs.add(namedGraphs.get(ngURI));
}
updateResults.addedStatements.add(additionsArray[id]);
} else {
URI ngURI = removalsArray[id].getNamedGraphUri();
if (!ngURI.equals(GRAPHS.GRAPHS_DATASET) && !ngURI.equals(GRAPHS.METADATA_GRAPHS_DATASET)) {
updateResults.namedGraphs.add(namedGraphs.get(ngURI));
}
updateResults.removedStatements.add(removalsArray[id]);
}
}
} finally {
if (results != null)
results.close();
}
middle = System.currentTimeMillis();
if (log.isDebugEnabled()) {
log.debug(LogUtils.RDB_MARKER, "[RESOLVE UPDATED STATEMENTS_NR] {}", Long.toString((middle - start)));
}
}
start = middle;
BaseSQL.clearTableWithSessionPrefix(context.getStatementProvider(), context.getConnection(), context.getConfiguration().getSessionPrefix(), STMTS_TMP);
middle = System.currentTimeMillis();
if (log.isDebugEnabled()) {
log.debug(LogUtils.RDB_MARKER, "[DELETE TEMP STATEMENTS_NR] {}", Long.toString((middle - start)));
}
long totalTime = (System.currentTimeMillis() - startOverall);
if (log.isDebugEnabled()) {
log.debug(LogUtils.RDB_MARKER, "[STORED_NR] {}:{}:{} Q/ms:{} ms/Q", new Object[] { Long.toString(countA), Long.toString(totalTime), Long.toString((countA / (totalTime + 1))), Long.toString((totalTime / (countA + 1))) });
}
return updateResults;
}
private static final String ID_STRING = "{0}:{1}:{2}:{3}";
static private int insert(NodeCentricOperationContext context, long transactionId, Map<URI, IStoredNamedGraph> revisions, Statement[] statements, Map<Value, Long> storedNodes) throws AnzoException {
try {
if (context.getConfiguration().getSupportsTempForInsert() && statements.length > 0) {
InsertStatementsRdbWrapper.BatchInsertTempStatement insertPrepared = new InsertStatementsRdbWrapper.BatchInsertTempStatement(context.getConnection(), context.getStatementProvider(), context.getConfiguration().getSessionPrefix());
try {
long start = System.currentTimeMillis();
long end = 0;
URI lastNG = null;
Long lastUUID = null;
Map<URI, Long> uriToUUIDid = new HashMap<URI, Long>();
for (int i = 0; (i * NodeCentricDatasource.MAX_OPERATION_SIZE) <= statements.length; i++) {
int offset = (i * NodeCentricDatasource.MAX_OPERATION_SIZE);
for (int k = offset; k < Math.min(offset + NodeCentricDatasource.MAX_OPERATION_SIZE, statements.length); k++) {
Statement statement = statements[k];
Long ngId = storedNodes.get(statement.getNamedGraphUri());
Long subjId = storedNodes.get(statement.getSubject());
Long predId = storedNodes.get(statement.getPredicate());
Long objId = storedNodes.get(statement.getObject());
if (ngId == null || subjId == null || predId == null || objId == null) {
throw new RdbException(ExceptionConstants.DATASOURCE.LOAD_OBJECT);
}
String stmtId = MessageFormat.format(ID_STRING, ngId.toString(), subjId.toString(), predId.toString(), objId.toString());
IStoredNamedGraph revision = revisions.get(statement.getNamedGraphUri());
if (lastNG == null || !lastNG.equals(statement.getNamedGraphUri())) {
lastUUID = uriToUUIDid.get(statement.getNamedGraphUri());
if (lastUUID == null) {
lastUUID = context.getNodeLayout().fetchId(revision.getUUID(), context.getConnection());
if (lastUUID == null) {
throw new RdbException(ExceptionConstants.DATASOURCE.LOAD_OBJECT);
}
uriToUUIDid.put(statement.getNamedGraphUri(), lastUUID);
}
lastNG = statement.getNamedGraphUri();
}
insertPrepared.addEntry(1, k, stmtId, UriGenerator.isMetadataGraphUri(statement.getNamedGraphUri()) ? 1 : 0, lastUUID, ngId, subjId, predId, objId, revision.getNewRevision(), transactionId);
}
insertPrepared.executeStatement();
}
end = System.currentTimeMillis();
if (log.isDebugEnabled()) {
log.debug(LogUtils.RDB_MARKER, "[BATCH INSERT TEMP STATEMENTS] {}:{}", Integer.toString(statements.length), Long.toString((end - start)));
}
return statements.length;
} finally {
insertPrepared.close();
}
} else if (statements.length > 0) {
long start = System.currentTimeMillis();
URI lastNG = null;
Long lastUUID = null;
Map<URI, Long> uriToUUIDid = new HashMap<URI, Long>();
for (int k = 0; k < statements.length; k++) {
Statement statement = statements[k];
Long ngId = storedNodes.get(statement.getNamedGraphUri());
Long subjId = storedNodes.get(statement.getSubject());
Long predId = storedNodes.get(statement.getPredicate());
Long objId = storedNodes.get(statement.getObject());
if (ngId == null || subjId == null || predId == null || objId == null) {
throw new RdbException(ExceptionConstants.DATASOURCE.LOAD_OBJECT);
}
String stmtId = MessageFormat.format(ID_STRING, ngId.toString(), subjId.toString(), predId.toString(), objId.toString());
IStoredNamedGraph revision = revisions.get(statement.getNamedGraphUri());
if (lastNG == null || !lastNG.equals(statement.getNamedGraphUri())) {
lastUUID = uriToUUIDid.get(statement.getNamedGraphUri());
if (lastUUID == null) {
lastUUID = context.getNodeLayout().fetchId(revision.getUUID(), context.getConnection());
if (lastUUID == null) {
throw new RdbException(ExceptionConstants.DATASOURCE.LOAD_OBJECT);
}
uriToUUIDid.put(statement.getNamedGraphUri(), lastUUID);
}
lastNG = statement.getNamedGraphUri();
}
InsertStatementsRdbWrapper.insertTempStatement(context.getStatementProvider(), context.getConnection(), 1, k, stmtId, statement.getNamedGraphUri().toString().startsWith(NAMESPACES.METADATAGRAPH_PREFIX) ? 1 : 0, lastUUID, ngId, subjId, predId, objId, revision.getNewRevision(), transactionId, context.getConfiguration().getSessionPrefix());
}
long end = System.currentTimeMillis();
if (log.isDebugEnabled()) {
log.debug(LogUtils.RDB_MARKER, "[INDV INSERT TEMP STATEMENTS] {}:{}", Integer.toString(statements.length), Long.toString((end - start)));
}
return statements.length;
} else {
return 0;
}
} catch (RdbException rdb) {
throw new AnzoException(ExceptionConstants.RDB.FAILED_EXECUTING_SQL, rdb);
}
}
static private int remove(NodeCentricOperationContext context, long transactionId, Map<URI, IStoredNamedGraph> revisions, Statement[] statements) throws AnzoException {
try {
long start = System.currentTimeMillis();
long end = 0;
int total = 0;
if (context.getConfiguration().getSupportsTempForInsert() && statements.length > 0) {
InsertStatementsRdbWrapper.BatchInsertTempStatement insertPrepared = new InsertStatementsRdbWrapper.BatchInsertTempStatement(context.getConnection(), context.getStatementProvider(), context.getConfiguration().getSessionPrefix());
try {
HashSet<Value> values = new HashSet<Value>();
for (org.openanzo.rdf.Statement statement : statements) {
values.add(statement.getNamedGraphUri());
values.add(statement.getSubject());
values.add(statement.getPredicate());
values.add(statement.getObject());
}
Map<Value, Long> alreadyStored = context.getNodeLayout().resolveStoredNodes(values, false, context.getConnection(), -1);
end = System.currentTimeMillis();
if (log.isDebugEnabled()) {
log.debug(LogUtils.RDB_MARKER, "[RESOLVE_STORED_NODES] {}:{}", Integer.toString(alreadyStored.size()), Long.toString((end - start)));
}
start = end;
URI lastNG = null;
Long lastUUID = null;
Map<URI, Long> uriToUUIDid = new HashMap<URI, Long>();
for (int i = 0; (i * NodeCentricDatasource.MAX_OPERATION_SIZE) <= statements.length; i++) {
int offset = (i * NodeCentricDatasource.MAX_OPERATION_SIZE);
for (int k = offset; k < Math.min(offset + NodeCentricDatasource.MAX_OPERATION_SIZE, statements.length); k++) {
Statement statement = statements[k];
Long ngId = alreadyStored.get(statement.getNamedGraphUri());
if (ngId == null) {
continue;
}
Long subjId = alreadyStored.get(statement.getSubject());
if (subjId == null) {
continue;
}
Long predId = alreadyStored.get(statement.getPredicate());
if (predId == null) {
continue;
}
Long objId = alreadyStored.get(statement.getObject());
if (objId == null) {
continue;
}
String stmtId = MessageFormat.format(ID_STRING, ngId.toString(), subjId.toString(), predId.toString(), objId.toString());
IStoredNamedGraph revision = revisions.get(statement.getNamedGraphUri());
if (lastNG == null || !lastNG.equals(statement.getNamedGraphUri())) {
lastUUID = uriToUUIDid.get(statement.getNamedGraphUri());
if (lastUUID == null) {
lastUUID = context.getNodeLayout().fetchId(revision.getUUID(), context.getConnection());
if (lastUUID == null) {
throw new RdbException(ExceptionConstants.DATASOURCE.LOAD_OBJECT);
}
uriToUUIDid.put(statement.getNamedGraphUri(), lastUUID);
}
lastNG = statement.getNamedGraphUri();
}
insertPrepared.addEntry(0, k, stmtId, UriGenerator.isMetadataGraphUri(statement.getNamedGraphUri()) ? 1 : 0, lastUUID, ngId, subjId, predId, objId, revision.getNewRevision(), transactionId);
total++;
}
insertPrepared.executeStatement();
}
end = System.currentTimeMillis();
if (log.isDebugEnabled()) {
log.debug(LogUtils.RDB_MARKER, "[BATCH INSERT TEMP STATEMENTS] {}:{}", Integer.toString(total), Long.toString((end - start)));
}
} finally {
insertPrepared.close();
}
} else if (statements.length > 0) {
URI lastNG = null;
Long lastUUID = null;
Map<URI, Long> uriToUUIDid = new HashMap<URI, Long>();
for (int id = 0; id < statements.length; id++) {
Statement statement = statements[id];
Long ngId = context.getNodeLayout().fetchId(statement.getNamedGraphUri(), context.getConnection());
Long subjId = context.getNodeLayout().fetchId(statement.getSubject(), context.getConnection());
Long predId = context.getNodeLayout().fetchId(statement.getPredicate(), context.getConnection());
Long objId = context.getNodeLayout().fetchId(statement.getObject(), context.getConnection());
if (ngId != null && subjId != null && predId != null && objId != null) {
String stmtId = MessageFormat.format(ID_STRING, ngId.toString(), subjId.toString(), predId.toString(), objId.toString());
IStoredNamedGraph revision = revisions.get(statement.getNamedGraphUri());
if (lastNG == null || !lastNG.equals(statement.getNamedGraphUri())) {
lastUUID = uriToUUIDid.get(statement.getNamedGraphUri());
if (lastUUID == null) {
lastUUID = context.getNodeLayout().fetchId(revision.getUUID(), context.getConnection());
if (lastUUID == null) {
throw new RdbException(ExceptionConstants.DATASOURCE.LOAD_OBJECT);
}
uriToUUIDid.put(statement.getNamedGraphUri(), lastUUID);
}
lastNG = statement.getNamedGraphUri();
}
InsertStatementsRdbWrapper.insertTempStatement(context.getStatementProvider(), context.getConnection(), 0, total, stmtId, statement.getNamedGraphUri().toString().startsWith(NAMESPACES.METADATAGRAPH_PREFIX) ? 1 : 0, lastUUID, ngId, subjId, predId, objId, revision.getNewRevision(), transactionId, context.getConfiguration().getSessionPrefix());
}
total++;
}
end = System.currentTimeMillis();
if (log.isDebugEnabled()) {
log.debug(LogUtils.RDB_MARKER, "[INDV INSERT TEMP STATEMENTS] {}:{}", Integer.toString(total), Long.toString((end - start)));
}
}
return total;
} catch (RdbException rdb) {
throw new AnzoException(ExceptionConstants.RDB.FAILED_EXECUTING_SQL, rdb);
}
}
}