use of org.umlg.sqlg.strategy.Emit in project sqlg by pietermartin.
the class SqlgUtil method loadLabeledElements.
/**
* Loads all labeled or emitted elements.
*
* @param sqlgGraph
* @param resultSet
* @param subQueryStack
* @param lastQueryStack
* @param lastElementIdCountMap
* @return
* @throws SQLException
*/
private static <E extends SqlgElement> List<Emit<E>> loadLabeledElements(SqlgGraph sqlgGraph, final ResultSet resultSet, LinkedList<SchemaTableTree> subQueryStack, boolean lastQueryStack, Map<String, Integer> lastElementIdCountMap, boolean forParent) throws SQLException {
List<Emit<E>> result = new ArrayList<>();
int count = 1;
for (SchemaTableTree schemaTableTree : subQueryStack) {
if (!schemaTableTree.getLabels().isEmpty()) {
String idProperty = schemaTableTree.labeledAliasId();
Integer columnCount = lastElementIdCountMap.get(idProperty);
Long id = resultSet.getLong(columnCount);
if (!resultSet.wasNull()) {
E sqlgElement;
if (schemaTableTree.getSchemaTable().isVertexTable()) {
String rawLabel = schemaTableTree.getSchemaTable().getTable().substring(VERTEX_PREFIX.length());
sqlgElement = (E) SqlgVertex.of(sqlgGraph, id, schemaTableTree.getSchemaTable().getSchema(), rawLabel);
} else {
String rawLabel = schemaTableTree.getSchemaTable().getTable().substring(EDGE_PREFIX.length());
sqlgElement = (E) new SqlgEdge(sqlgGraph, id, schemaTableTree.getSchemaTable().getSchema(), rawLabel);
}
schemaTableTree.loadProperty(resultSet, sqlgElement);
// Elements that come before the last element in the path must not get the labels.
if (schemaTableTree.isEmit() && !lastQueryStack) {
if (forParent) {
result.add(new Emit<>(resultSet.getLong(1), sqlgElement, Collections.emptySet(), schemaTableTree.getStepDepth(), schemaTableTree.getSqlgComparatorHolder()));
} else {
result.add(new Emit<>(sqlgElement, Collections.emptySet(), schemaTableTree.getStepDepth(), schemaTableTree.getSqlgComparatorHolder()));
}
} else if (schemaTableTree.isEmit() && lastQueryStack && (count != subQueryStack.size())) {
if (forParent) {
result.add(new Emit<>(resultSet.getLong(1), sqlgElement, Collections.emptySet(), schemaTableTree.getStepDepth(), schemaTableTree.getSqlgComparatorHolder()));
} else {
result.add(new Emit<>(sqlgElement, Collections.emptySet(), schemaTableTree.getStepDepth(), schemaTableTree.getSqlgComparatorHolder()));
}
} else {
if (forParent) {
result.add(new Emit<>(resultSet.getLong(1), sqlgElement, schemaTableTree.getRealLabels(), schemaTableTree.getStepDepth(), schemaTableTree.getSqlgComparatorHolder()));
} else {
result.add(new Emit<>(sqlgElement, schemaTableTree.getRealLabels(), schemaTableTree.getStepDepth(), schemaTableTree.getSqlgComparatorHolder()));
}
}
}
}
count++;
}
return result;
}
use of org.umlg.sqlg.strategy.Emit in project sqlg by pietermartin.
the class SqlgUtil method loadResultSetIntoResultIterator.
/**
* @param sqlgGraph
* @param resultSetMetaData
* @param resultSet
* @param rootSchemaTableTree
* @param subQueryStacks
* @param first
* @param lastElementIdCountMap
* @param forParent Indicates that the gremlin query is for SqlgVertexStep. It is in the context of an incoming traverser, the parent.
* @return A list of @{@link Emit}s that represent a single @{@link org.apache.tinkerpop.gremlin.process.traversal.Path}
* @throws SQLException
*/
public static List<Emit<SqlgElement>> loadResultSetIntoResultIterator(SqlgGraph sqlgGraph, ResultSetMetaData resultSetMetaData, ResultSet resultSet, SchemaTableTree rootSchemaTableTree, List<LinkedList<SchemaTableTree>> subQueryStacks, boolean first, Map<String, Integer> lastElementIdCountMap, boolean forParent) throws SQLException {
List<Emit<SqlgElement>> result = new ArrayList<>();
if (resultSet.next()) {
if (first) {
for (LinkedList<SchemaTableTree> subQueryStack : subQueryStacks) {
for (SchemaTableTree schemaTableTree : subQueryStack) {
schemaTableTree.clearColumnNamePropertyNameMap();
}
}
populateIdCountMap(resultSetMetaData, rootSchemaTableTree, lastElementIdCountMap);
}
int subQueryDepth = 1;
for (LinkedList<SchemaTableTree> subQueryStack : subQueryStacks) {
List<Emit<SqlgElement>> labeledElements = SqlgUtil.loadLabeledElements(sqlgGraph, resultSet, subQueryStack, subQueryDepth == subQueryStacks.size(), lastElementIdCountMap, forParent);
result.addAll(labeledElements);
if (subQueryDepth == subQueryStacks.size()) {
SchemaTableTree lastSchemaTableTree = subQueryStack.getLast();
if (labeledElements.isEmpty()) {
SqlgElement e = SqlgUtil.loadElement(sqlgGraph, lastElementIdCountMap, resultSet, lastSchemaTableTree);
Emit<SqlgElement> emit;
if (!forParent) {
emit = new Emit<>(e, Collections.emptySet(), lastSchemaTableTree.getStepDepth(), lastSchemaTableTree.getSqlgComparatorHolder());
} else {
emit = new Emit<>(resultSet.getLong(1), e, Collections.emptySet(), lastSchemaTableTree.getStepDepth(), lastSchemaTableTree.getSqlgComparatorHolder());
}
if (lastSchemaTableTree.isLocalStep() && lastSchemaTableTree.isOptionalLeftJoin()) {
emit.setIncomingOnlyLocalOptionalStep(true);
}
result.add(emit);
}
if (lastSchemaTableTree.getReplacedStepDepth() == lastSchemaTableTree.getStepDepth() && lastSchemaTableTree.isEmit() && lastSchemaTableTree.isUntilFirst()) {
Emit<SqlgElement> repeatEmit = labeledElements.get(labeledElements.size() - 1);
repeatEmit.setRepeat(true);
}
}
subQueryDepth++;
}
}
return result;
}
Aggregations