Search in sources :

Example 1 with Emit

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;
}
Also used : Emit(org.umlg.sqlg.strategy.Emit) SchemaTableTree(org.umlg.sqlg.sql.parse.SchemaTableTree)

Example 2 with Emit

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;
}
Also used : Emit(org.umlg.sqlg.strategy.Emit) SchemaTableTree(org.umlg.sqlg.sql.parse.SchemaTableTree)

Aggregations

SchemaTableTree (org.umlg.sqlg.sql.parse.SchemaTableTree)2 Emit (org.umlg.sqlg.strategy.Emit)2