in sql-gremlin/src/main/java/org/twilmes/sql/gremlin/adapter/converter/SqlTraversalEngine.java [147:189]
private static void appendGraphTraversal(final String table, final String column,
final SqlMetadata sqlMetadata,
final GraphTraversal<?, ?> graphTraversal) throws SQLException {
final GremlinTableBase gremlinTableBase = sqlMetadata.getGremlinTable(table);
final String columnName = sqlMetadata.getActualColumnName(gremlinTableBase, column);
// Primary/foreign key, need to traverse appropriately.
if (!columnName.endsWith(GremlinTableBase.ID)) {
if (sqlMetadata.getIsAggregate()) {
graphTraversal.has(columnName).values(columnName);
} else {
appendColumnSelect(sqlMetadata, columnName, graphTraversal);
}
} else {
// It's this vertex/edge.
if (columnName.toLowerCase(Locale.getDefault())
.startsWith(gremlinTableBase.getLabel().toLowerCase(Locale.getDefault()))) {
graphTraversal.id();
} else {
if (columnName.endsWith(IN_ID)) {
// Vertices can have many connected, edges (thus we need to fold). Edges can only connect to 1 vertex.
if (gremlinTableBase.getIsVertex()) {
graphTraversal.coalesce(__.inE().hasLabel(columnName.replace(IN_ID, "")).id().fold(),
__.constant(new ArrayList<>()));
} else {
graphTraversal.coalesce(__.inV().hasLabel(columnName.replace(IN_ID, "")).id(),
__.constant(new ArrayList<>()));
}
} else if (column.endsWith(OUT_ID)) {
// Vertices can have many connected, edges (thus we need to fold). Edges can only connect to 1 vertex.
if (gremlinTableBase.getIsVertex()) {
graphTraversal.coalesce(__.outE().hasLabel(columnName.replace(OUT_ID, "")).id().fold(),
__.constant(new ArrayList<>()));
} else {
graphTraversal.coalesce(__.outV().hasLabel(columnName.replace(OUT_ID, "")).id(),
__.constant(new ArrayList<>()));
}
} else {
graphTraversal.constant(new ArrayList<>());
}
}
}
}