@Override protected R visitTableSubquery(TableSubquery node, C context) { return process(node.getQuery(), context); }
@Override protected RelationPlan visitTableSubquery(TableSubquery node, Void context) { return process(node.getQuery(), context); }
@Override protected Void visitTableSubquery(TableSubquery node, Integer indent) { builder.append('(') .append('\n'); process(node.getQuery(), indent + 1); append(indent, ") "); return null; }
@Override protected Scope visitTableSubquery(TableSubquery node, Optional<Scope> scope) { StatementAnalyzer analyzer = new StatementAnalyzer(analysis, metadata, sqlParser, accessControl, session, WarningCollector.NOOP); Scope queryScope = analyzer.analyze(node.getQuery(), scope); return createAndAssignScope(node, scope, queryScope.getRelationType()); }
@Override protected Node visitShowStats(ShowStats node, Void context) { checkState(queryExplainer.isPresent(), "Query explainer must be provided for SHOW STATS SELECT"); if (node.getRelation() instanceof TableSubquery) { Query query = ((TableSubquery) node.getRelation()).getQuery(); QuerySpecification specification = (QuerySpecification) query.getQueryBody(); Plan plan = queryExplainer.get().getLogicalPlan(session, new Query(Optional.empty(), specification, Optional.empty(), Optional.empty()), parameters, warningCollector); validateShowStatsSubquery(node, query, specification, plan); Table table = (Table) specification.getFrom().get(); Constraint<ColumnHandle> constraint = getConstraint(plan); return rewriteShowStats(node, table, constraint); } else if (node.getRelation() instanceof Table) { Table table = (Table) node.getRelation(); return rewriteShowStats(node, table, Constraint.alwaysTrue()); } else { throw new IllegalArgumentException("Expected either TableSubquery or Table as relation"); } }
@Override protected Void visitTableSubquery(TableSubquery node, Integer indent) { builder.append('(') .append('\n'); process(node.getQuery(), indent + 1); append(indent, ") "); return null; }
@Override protected R visitTableSubquery(TableSubquery node, C context) { return process(node.getQuery(), context); }
@Override protected RelationPlan visitTableSubquery(TableSubquery node, Void context) { return process(node.getQuery(), context); }
@Override protected R visitTableSubquery(TableSubquery node, C context) { return process(node.getQuery(), context); }
@Override protected Void visitTableSubquery(TableSubquery node, Integer indent) { builder.append('(') .append('\n'); process(node.getQuery(), indent + 1); append(indent, ") "); return null; }
@Override protected Void visitTableSubquery(TableSubquery node, Integer indent) { builder.append('(') .append('\n'); process(node.getQuery(), indent + 1); append(indent, ") "); return null; }
@Override protected Void visitTableSubquery(TableSubquery node, Integer indent) { builder.append('(') .append('\n'); process(node.getQuery(), indent + 1); append(indent, ") "); return null; }
@Override protected RelationType visitTableSubquery(TableSubquery node, AnalysisContext context) { StatementAnalyzer analyzer = new StatementAnalyzer(analysis, metadata, sqlParser, accessControl, session, experimentalSyntaxEnabled, Optional.empty()); RelationType descriptor = analyzer.process(node.getQuery(), context); analysis.setOutputDescriptor(node, descriptor); return descriptor; }
@Override protected List<QuerySource> visitQueryBody(QueryBody node, QueryState state){ ArrayList<QuerySource> relations = new ArrayList<QuerySource>(); if(node instanceof Table){ String table = ((Table)node).getName().toString(); // resolve relations provided in dot notation (schema.index.type) and just get the type for now String[] catIndexType = table.split("\\."); if(catIndexType.length == 1) { relations.add(new QuerySource(table)); }else{ relations.add(new QuerySource(catIndexType[catIndexType.length-2], catIndexType[catIndexType.length-1])); } }else if (node instanceof TableSubquery){ TableSubquery ts = (TableSubquery)node; Object alias = state.getValue("table_alias"); Pattern queryRegex = Pattern.compile("from\\s*\\((.+)\\)\\s*(where|as|having|limit|$"+(alias==null ? "":"|"+alias)+")", Pattern.CASE_INSENSITIVE); Matcher m = queryRegex.matcher(state.originalSql()); // ToDo: check we take index.type if(m.find()) { relations.add(new QuerySource(m.group(1), ts.getQuery().getQueryBody())); }else state.addException("Unable to parse provided subquery in FROM clause"); }else state.addException("Unable to parse FROM clause, "+node.getClass().getName()+" is not supported"); return relations; }