use of com.yahoo.elide.datastores.aggregation.queryengines.sql.dialects.SQLDialect in project elide by yahoo.
the class MetaDataStoreIntegrationTest method createHarness.
@Override
protected DataStoreTestHarness createHarness() {
HikariConfig config = new HikariConfig(File.separator + "jpah2db.properties");
DataSource defaultDataSource = new HikariDataSource(config);
SQLDialect defaultDialect = SQLDialectFactory.getDefaultDialect();
ConnectionDetails defaultConnectionDetails = new ConnectionDetails(defaultDataSource, defaultDialect);
Properties prop = new Properties();
prop.put("javax.persistence.jdbc.driver", config.getDriverClassName());
prop.put("javax.persistence.jdbc.url", config.getJdbcUrl());
EntityManagerFactory emf = Persistence.createEntityManagerFactory("aggregationStore", prop);
Map<String, ConnectionDetails> connectionDetailsMap = new HashMap<>();
// Add an entry for "mycon" connection which is not from hjson
connectionDetailsMap.put("mycon", defaultConnectionDetails);
// Add connection details fetched from hjson
VALIDATOR.getElideSQLDBConfig().getDbconfigs().forEach(dbConfig -> connectionDetailsMap.put(dbConfig.getName(), new ConnectionDetails(getDataSource(dbConfig, getDBPasswordExtractor()), SQLDialectFactory.getDialect(dbConfig.getDialect()))));
return new AggregationDataStoreTestHarness(emf, defaultConnectionDetails, connectionDetailsMap, VALIDATOR);
}
use of com.yahoo.elide.datastores.aggregation.queryengines.sql.dialects.SQLDialect 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.queryengines.sql.dialects.SQLDialect in project elide by yahoo.
the class SQLQueryEngine method getPageTotal.
private long getPageTotal(Query expandedQuery, NativeQuery sql, Query clientQuery, SqlTransaction sqlTransaction) {
ConnectionDetails details = expandedQuery.getConnectionDetails();
DataSource dataSource = details.getDataSource();
SQLDialect dialect = details.getDialect();
NativeQuery paginationSQL = toPageTotalSQL(expandedQuery, sql, dialect);
if (paginationSQL == null) {
// Only 1 record will be returned.
return 1;
}
NamedParamPreparedStatement stmt = sqlTransaction.initializeStatement(paginationSQL.toString(), dataSource);
// Supply the query parameters to the query
supplyFilterQueryParameters(clientQuery, stmt, dialect);
// Run the Pagination query and log the time spent.
Long result = CoerceUtil.coerce(runQuery(stmt, paginationSQL.toString(), SINGLE_RESULT_MAPPER), Long.class);
return (result != null) ? result : 0;
}
use of com.yahoo.elide.datastores.aggregation.queryengines.sql.dialects.SQLDialect in project elide by yahoo.
the class SQLColumnProjection method canNest.
@Override
default boolean canNest(Queryable source, MetaDataStore metaDataStore) {
SQLDialect dialect = source.getConnectionDetails().getDialect();
String sql = toSQL(source, metaDataStore);
SyntaxVerifier verifier = new SyntaxVerifier(dialect);
boolean canNest = verifier.verify(sql);
if (!canNest) {
LOGGER.debug("Unable to nest {} because {}", this.getName(), verifier.getLastError());
return false;
}
List<Reference> references = new ExpressionParser(metaDataStore).parse(source, this);
// because rewriting the SQL in the outer expression will lose the context of the calling $$column.
return references.stream().map(reference -> reference.accept(new ReferenceExtractor<JoinReference>(JoinReference.class, metaDataStore, ReferenceExtractor.Mode.SAME_QUERY))).flatMap(Set::stream).map(reference -> reference.accept(new ReferenceExtractor<ColumnArgReference>(ColumnArgReference.class, metaDataStore))).flatMap(Set::stream).collect(Collectors.toSet()).isEmpty();
}
Aggregations