use of com.yahoo.elide.datastores.aggregation.query.Queryable in project elide by yahoo.
the class ColumnContext method getJoinContext.
protected ColumnContext getJoinContext(String key) {
SQLJoin sqlJoin = this.queryable.getJoin(key);
String joinExpression = sqlJoin.getJoinExpression();
PhysicalRefColumnContext context = PhysicalRefColumnContext.physicalRefContextBuilder().queryable(this.getQueryable()).metaDataStore(this.getMetaDataStore()).column(this.getColumn()).tableArguments(this.getTableArguments()).build();
// This will resolve everything within join expression except Physical References, Use this resolved value
// to create alias for join dynamically.
String resolvedJoinExpr = context.resolve(joinExpression);
String joinAlias = createSafeAlias(appendAlias(this.alias, key), resolvedJoinExpr);
Queryable joinQueryable = metaDataStore.getTable(sqlJoin.getJoinTableType());
ColumnContext joinCtx = ColumnContext.builder().queryable(joinQueryable).alias(joinAlias).metaDataStore(this.metaDataStore).column(this.column).tableArguments(mergedArgumentMap(joinQueryable.getArguments(), this.getTableArguments())).build();
return joinCtx;
}
use of com.yahoo.elide.datastores.aggregation.query.Queryable in project elide by yahoo.
the class HasJoinVisitorTest method testHasJoin.
@Test
void testHasJoin() {
Queryable source = mock(Queryable.class);
JoinPath path = mock(JoinPath.class);
ColumnProjection column = mock(ColumnProjection.class);
Reference reference = LogicalReference.builder().source(source).column(column).reference(PhysicalReference.builder().name("foo").source(source).build()).reference(JoinReference.builder().source(source).path(path).reference(PhysicalReference.builder().name("bar").source(source).build()).build()).build();
assertTrue(reference.accept(new HasJoinVisitor()));
}
use of com.yahoo.elide.datastores.aggregation.query.Queryable in project elide by yahoo.
the class HasJoinVisitorTest method testLogicalColumnNoJoin.
@Test
void testLogicalColumnNoJoin() {
Queryable source = mock(Queryable.class);
ColumnProjection column = mock(ColumnProjection.class);
Reference reference = LogicalReference.builder().source(source).column(column).reference(PhysicalReference.builder().name("foo").source(source).build()).build();
assertFalse(reference.accept(new HasJoinVisitor()));
}
use of com.yahoo.elide.datastores.aggregation.query.Queryable in project elide by yahoo.
the class SQLMetricProjection method nest.
@Override
public Pair<ColumnProjection, Set<ColumnProjection>> nest(Queryable source, MetaDataStore metaDataStore, boolean joinInOuter) {
SQLDialect dialect = source.getConnectionDetails().getDialect();
String sql = toSQL(source, metaDataStore);
SqlParser sqlParser = SqlParser.create(sql, CalciteUtils.constructParserConfig(dialect));
SqlNode node;
try {
node = sqlParser.parseExpression();
} catch (SqlParseException e) {
throw new IllegalStateException(e);
}
CalciteInnerAggregationExtractor innerExtractor = new CalciteInnerAggregationExtractor(dialect);
List<List<String>> innerAggExpressions = node.accept(innerExtractor);
List<List<String>> innerAggLabels = innerAggExpressions.stream().map(list -> list.stream().map((expression) -> getAggregationLabel(dialect.getCalciteDialect(), expression)).collect(Collectors.toList())).collect(Collectors.toList());
Set<ColumnProjection> innerAggProjections = new LinkedHashSet<>();
Iterator<String> labelIt = innerAggLabels.stream().flatMap(List::stream).iterator();
Iterator<String> expressionIt = innerAggExpressions.stream().flatMap(List::stream).iterator();
while (labelIt.hasNext() && expressionIt.hasNext()) {
String innerAggExpression = expressionIt.next();
String innerAggLabel = labelIt.next();
innerAggProjections.add(SQLMetricProjection.builder().projected(true).name(innerAggLabel).alias(innerAggLabel).expression(innerAggExpression).columnType(columnType).valueType(valueType).arguments(arguments).build());
}
CalciteOuterAggregationExtractor outerExtractor = new CalciteOuterAggregationExtractor(dialect, innerAggLabels);
SqlNode transformedParseTree = node.accept(outerExtractor);
String outerAggExpression = transformedParseTree.toSqlString(dialect.getCalciteDialect()).getSql();
// replace INNER_AGG_... with {{$INNER_AGG...}}
outerAggExpression = outerAggExpression.replaceAll(dialect.getBeginQuote() + "?(" + getAggregationLabelPrefix(dialect.getCalciteDialect()) + "\\w+)" + dialect.getEndQuote() + "?", "{{\\$" + "$1" + "}}");
String columnId = source.isRoot() ? getName() : getAlias();
boolean inProjection = source.getColumnProjection(columnId, arguments, true) != null;
ColumnProjection outerProjection = SQLMetricProjection.builder().projected(inProjection).expression(outerAggExpression).name(name).alias(alias).valueType(valueType).columnType(columnType).arguments(arguments).build();
return Pair.of(outerProjection, innerAggProjections);
}
use of com.yahoo.elide.datastores.aggregation.query.Queryable in project elide by yahoo.
the class HasJoinVisitorTest method testPhysicalColumnNoJoin.
@Test
void testPhysicalColumnNoJoin() {
Queryable source = mock(Queryable.class);
Reference reference = PhysicalReference.builder().name("foo").source(source).build();
assertFalse(reference.accept(new HasJoinVisitor()));
}
Aggregations