use of org.apache.rya.indexing.pcj.fluo.app.NodeType in project incubator-rya by apache.
the class SparqlFluoQueryBuilder method setChildMetadata.
/**
* Update a query node's metadata to include it's binding set variable order
* and it's parent node id. This information is only known when handling
* the parent node.
*
* @param fluoQueryBuilder - Builder whose metadata is updatad
* @param childNodeId - The node ID of the child node.
* @param childVarOrder - The variable order of the child node's binding sets.
* @param parentNodeId - The node ID that consumes the child's binding sets.
*/
private static void setChildMetadata(final FluoQuery.Builder fluoQueryBuilder, final String childNodeId, final VariableOrder childVarOrder, final String parentNodeId) {
checkNotNull(childNodeId);
checkNotNull(childVarOrder);
checkNotNull(parentNodeId);
final NodeType childType = NodeType.fromNodeId(childNodeId).get();
switch(childType) {
case STATEMENT_PATTERN:
StatementPatternMetadata.Builder spBuilder = fluoQueryBuilder.getStatementPatternBuilder(childNodeId).orNull();
if (spBuilder == null) {
spBuilder = StatementPatternMetadata.builder(childNodeId);
fluoQueryBuilder.addStatementPatternBuilder(spBuilder);
}
spBuilder.setVarOrder(childVarOrder);
spBuilder.setParentNodeId(parentNodeId);
break;
case JOIN:
JoinMetadata.Builder joinBuilder = fluoQueryBuilder.getJoinBuilder(childNodeId).orNull();
if (joinBuilder == null) {
joinBuilder = JoinMetadata.builder(childNodeId);
fluoQueryBuilder.addJoinMetadata(joinBuilder);
}
joinBuilder.setVarOrder(childVarOrder);
joinBuilder.setParentNodeId(parentNodeId);
break;
case FILTER:
FilterMetadata.Builder filterBuilder = fluoQueryBuilder.getFilterBuilder(childNodeId).orNull();
if (filterBuilder == null) {
filterBuilder = FilterMetadata.builder(childNodeId);
fluoQueryBuilder.addFilterMetadata(filterBuilder);
}
filterBuilder.setVarOrder(childVarOrder);
filterBuilder.setParentNodeId(parentNodeId);
break;
case AGGREGATION:
AggregationMetadata.Builder aggregationBuilder = fluoQueryBuilder.getAggregateBuilder(childNodeId).orNull();
if (aggregationBuilder == null) {
aggregationBuilder = AggregationMetadata.builder(childNodeId);
fluoQueryBuilder.addAggregateMetadata(aggregationBuilder);
}
aggregationBuilder.setVarOrder(childVarOrder);
aggregationBuilder.setParentNodeId(parentNodeId);
break;
case PROJECTION:
ProjectionMetadata.Builder projectionBuilder = fluoQueryBuilder.getProjectionBuilder(childNodeId).orNull();
if (projectionBuilder == null) {
projectionBuilder = ProjectionMetadata.builder(childNodeId);
fluoQueryBuilder.addProjectionBuilder(projectionBuilder);
}
projectionBuilder.setVarOrder(childVarOrder);
projectionBuilder.setParentNodeId(parentNodeId);
break;
case QUERY:
throw new IllegalArgumentException("A QUERY node cannot be the child of another node.");
case CONSTRUCT:
ConstructQueryMetadata.Builder constructBuilder = fluoQueryBuilder.getConstructQueryBuilder().orNull();
if (constructBuilder == null) {
constructBuilder = ConstructQueryMetadata.builder();
constructBuilder.setNodeId(childNodeId);
fluoQueryBuilder.setConstructQueryMetadata(constructBuilder);
}
Preconditions.checkArgument(childNodeId.equals(constructBuilder.getNodeId()));
constructBuilder.setVarOrder(childVarOrder);
constructBuilder.setParentNodeId(parentNodeId);
break;
case PERIODIC_QUERY:
PeriodicQueryMetadata.Builder periodicQueryBuilder = fluoQueryBuilder.getPeriodicQueryBuilder().orNull();
if (periodicQueryBuilder == null) {
periodicQueryBuilder = PeriodicQueryMetadata.builder();
periodicQueryBuilder.setNodeId(childNodeId);
fluoQueryBuilder.addPeriodicQueryMetadata(periodicQueryBuilder);
}
periodicQueryBuilder.setVarOrder(childVarOrder);
periodicQueryBuilder.setParentNodeId(parentNodeId);
break;
default:
throw new IllegalArgumentException("Unsupported NodeType: " + childType);
}
}
use of org.apache.rya.indexing.pcj.fluo.app.NodeType in project incubator-rya by apache.
the class SpanBatchBindingSetUpdater method deleteBatch.
private Optional<RowColumn> deleteBatch(TransactionBase tx, Optional<String> nodeId, Span span, Column column, int batchSize) {
log.trace("Deleting batch of size: " + batchSize + " using Span: " + span + " and Column: " + column);
RowScanner rs = tx.scanner().over(span).fetch(column).byRow().build();
try {
Iterator<ColumnScanner> colScannerIter = rs.iterator();
int count = 0;
boolean batchLimitMet = false;
Bytes row = span.getStart().getRow();
// get prefix if nodeId is specified
Optional<Bytes> prefixBytes = Optional.empty();
if (nodeId.isPresent()) {
NodeType type = NodeType.fromNodeId(nodeId.get()).get();
prefixBytes = Optional.ofNullable(Bytes.of(type.getNodeTypePrefix()));
}
while (colScannerIter.hasNext() && !batchLimitMet) {
ColumnScanner colScanner = colScannerIter.next();
row = colScanner.getRow();
// extract the nodeId from the returned row if a nodeId was passed
// into the SpanBatchInformation. This is to ensure that the returned
// row nodeId is equal to the nodeId passed in to the span batch information
Optional<String> rowNodeId = Optional.empty();
if (prefixBytes.isPresent()) {
rowNodeId = Optional.of(BindingSetRow.makeFromShardedRow(prefixBytes.get(), row).getNodeId());
}
// on the nodeId. This occurs when the hash is not included in the span
if (!rowNodeId.isPresent() || rowNodeId.equals(nodeId)) {
Iterator<ColumnValue> iter = colScanner.iterator();
while (iter.hasNext()) {
if (count >= batchSize) {
batchLimitMet = true;
break;
}
ColumnValue colVal = iter.next();
tx.delete(row, colVal.getColumn());
count++;
}
}
}
if (batchLimitMet) {
return Optional.of(new RowColumn(row));
} else {
return Optional.empty();
}
} catch (Exception e) {
return Optional.empty();
}
}
use of org.apache.rya.indexing.pcj.fluo.app.NodeType in project incubator-rya by apache.
the class BatchIT method verifyCounts.
private void verifyCounts(FluoClient fluoClient, List<String> ids, List<Integer> expectedCounts) {
Preconditions.checkArgument(ids.size() == expectedCounts.size());
for (int i = 0; i < ids.size(); i++) {
String id = ids.get(i);
int expected = expectedCounts.get(i);
NodeType type = NodeType.fromNodeId(id).get();
int count = countResults(fluoClient, id, type.getResultColumn());
switch(type) {
case STATEMENT_PATTERN:
assertEquals(expected, count);
break;
case JOIN:
assertEquals(expected, count);
break;
case QUERY:
assertEquals(expected, count);
break;
default:
break;
}
}
}
use of org.apache.rya.indexing.pcj.fluo.app.NodeType in project incubator-rya by apache.
the class DeleteFluoPcj method deleteMetadata.
/**
* Deletes metadata for all nodeIds associated with a given queryId in a
* single transaction. Prevents additional BindingSets from being created as
* new triples are added.
*
* @param tx - Transaction of a given Fluo table. (not null)
* @param nodeIds - Nodes whose metatdata will be deleted. (not null)
* @param pcjId - The PCJ ID of the query whose will be deleted. (not null)
*/
private void deleteMetadata(final Transaction tx, final List<String> nodeIds, final String pcjId) {
requireNonNull(tx);
requireNonNull(nodeIds);
requireNonNull(pcjId);
try (final Transaction typeTx = tx) {
Set<String> spNodeIds = new HashSet<>();
// remove metadata associated with each nodeId and store statement pattern nodeIds
for (final String nodeId : nodeIds) {
final NodeType type = NodeType.fromNodeId(nodeId).get();
if (type == NodeType.STATEMENT_PATTERN) {
spNodeIds.add(nodeId);
}
deleteMetadataColumns(typeTx, nodeId, type.getMetaDataColumns());
}
// Use stored statement pattern nodeIds to update list of stored statement pattern nodeIds
// in Fluo table
StatementPatternIdManager.removeStatementPatternIds(typeTx, spNodeIds);
typeTx.commit();
}
}
use of org.apache.rya.indexing.pcj.fluo.app.NodeType in project incubator-rya by apache.
the class BindingSetUpdater method process.
@Override
public final void process(final TransactionBase tx, final Bytes row, final Column col) {
checkNotNull(tx);
checkNotNull(row);
checkNotNull(col);
final Observation observation;
try {
observation = parseObservation(tx, row);
} catch (final Exception e) {
log.error("Unable to parse an Observation from a Row and Column pair, so this notification will be skipped. " + "Row: " + row + " Column: " + col, e);
return;
}
final String observedNodeId = observation.getObservedNodeId();
final VisibilityBindingSet observedBindingSet = observation.getObservedBindingSet();
final String parentNodeId = observation.getParentId();
// Figure out which node needs to handle the new metadata.
final NodeType parentNodeType = NodeType.fromNodeId(parentNodeId).get();
switch(parentNodeType) {
case QUERY:
final QueryMetadata parentQuery = queryDao.readQueryMetadata(tx, parentNodeId);
try {
queryUpdater.updateQueryResults(tx, observedBindingSet, parentQuery);
} catch (final Exception e) {
throw new RuntimeException("Could not process a Query node.", e);
}
break;
case PROJECTION:
final ProjectionMetadata projectionQuery = queryDao.readProjectionMetadata(tx, parentNodeId);
try {
projectionUpdater.updateProjectionResults(tx, observedBindingSet, projectionQuery);
} catch (final Exception e) {
throw new RuntimeException("Could not process a Query node.", e);
}
break;
case CONSTRUCT:
final ConstructQueryMetadata constructQuery = queryDao.readConstructQueryMetadata(tx, parentNodeId);
try {
constructUpdater.updateConstructQueryResults(tx, observedBindingSet, constructQuery);
} catch (final Exception e) {
throw new RuntimeException("Could not process a Query node.", e);
}
break;
case FILTER:
final FilterMetadata parentFilter = queryDao.readFilterMetadata(tx, parentNodeId);
try {
filterUpdater.updateFilterResults(tx, observedBindingSet, parentFilter);
} catch (final Exception e) {
throw new RuntimeException("Could not process a Filter node.", e);
}
break;
case JOIN:
final JoinMetadata parentJoin = queryDao.readJoinMetadata(tx, parentNodeId);
try {
joinUpdater.updateJoinResults(tx, observedNodeId, observedBindingSet, parentJoin);
} catch (final Exception e) {
throw new RuntimeException("Could not process a Join node.", e);
}
break;
case PERIODIC_QUERY:
final PeriodicQueryMetadata parentPeriodicQuery = queryDao.readPeriodicQueryMetadata(tx, parentNodeId);
try {
periodicQueryUpdater.updatePeriodicBinResults(tx, observedBindingSet, parentPeriodicQuery);
} catch (Exception e) {
throw new RuntimeException("Could not process PeriodicBin node.", e);
}
break;
case AGGREGATION:
final AggregationMetadata parentAggregation = queryDao.readAggregationMetadata(tx, parentNodeId);
try {
aggregationUpdater.updateAggregateResults(tx, observedBindingSet, parentAggregation);
} catch (final Exception e) {
throw new RuntimeException("Could not process an Aggregation node.", e);
}
break;
default:
throw new IllegalArgumentException("The parent node's NodeType must be of type Aggregation, Projection, ConstructQuery, Filter, Join, PeriodicBin or Query, but was " + parentNodeType);
}
}
Aggregations