code: public SchemaTableTree parse(SchemaTable schemaTable, ReplacedStepTree replacedStepTree) {
          ReplacedStep<?, ?> rootReplacedStep = replacedStepTree.root().getReplacedStep();
          Preconditions.checkArgument(!rootReplacedStep.isGraphStep(), "Expected VertexStep, found GraphStep");
  
          Set<SchemaTableTree> schemaTableTrees = new HashSet<>();
          //replacedSteps contains a fake label representing the incoming vertex for the SqlgVertexStepStrategy.
          SchemaTableTree rootSchemaTableTree = new SchemaTableTree(this.sqlgGraph, schemaTable, 0, replacedStepTree.getDepth());
          rootSchemaTableTree.setOptionalLeftJoin(rootReplacedStep.isLeftJoin());
          rootSchemaTableTree.setEmit(rootReplacedStep.isEmit());
          rootSchemaTableTree.setUntilFirst(rootReplacedStep.isUntilFirst());
          rootSchemaTableTree.initializeAliasColumnNameMaps();
          rootSchemaTableTree.setStepType(schemaTable.isVertexTable() ? SchemaTableTree.STEP_TYPE.VERTEX_STEP : SchemaTableTree.STEP_TYPE.EDGE_VERTEX_STEP);
          schemaTableTrees.add(rootSchemaTableTree);
          replacedStepTree.walkReplacedSteps(schemaTableTrees);
          rootSchemaTableTree.removeNodesInvalidatedByHas();
          rootSchemaTableTree.removeAllButDeepestAndAddCacheLeafNodes(replacedStepTree.getDepth());
          rootSchemaTableTree.setLocalStep(true);
          return rootSchemaTableTree;
      }
docs: This is only called for vertex steps.
  Constructs the label paths from the given schemaTable to the leaf vertex labels for the gremlin query.
  For each path Sqlg will executeRegularQuery a sql query. The union of the queries is the result the gremlin query.
  The vertex labels can be calculated from the steps.
  
  @param schemaTable The schema and table
  @param replacedStepTree The original VertexSteps and HasSteps that were replaced
  @return a List of paths. Each path is itself a list of SchemaTables.