use of com.yahoo.elide.datastores.aggregation.metadata.models.Metric in project elide by yahoo.
the class SQLQueryEngine method toPageTotalSQL.
/**
* Takes a SQLQuery and creates a new clone that instead returns the total number of records of the original
* query.
*
* @param query The client query
* @param sql The generated SQL query
* @param sqlDialect the SQL dialect
* @return A new query that returns the total number of records.
*/
private NativeQuery toPageTotalSQL(Query query, NativeQuery sql, SQLDialect sqlDialect) {
// TODO: refactor this method
String groupByDimensions = query.getAllDimensionProjections().stream().map(SQLColumnProjection.class::cast).filter(SQLColumnProjection::isProjected).map((column) -> column.toSQL(query, metaDataStore)).collect(Collectors.joining(", "));
if (groupByDimensions.isEmpty()) {
// Metric projection without group by dimension will return onely 1 record.
return null;
}
NativeQuery innerQuery = NativeQuery.builder().projectionClause(groupByDimensions).fromClause(sql.getFromClause()).joinClause(sql.getJoinClause()).whereClause(sql.getWhereClause()).groupByClause(String.format("GROUP BY %s", groupByDimensions)).havingClause(sql.getHavingClause()).build();
return NativeQuery.builder().projectionClause("COUNT(*)").fromClause(QueryTranslator.getFromClause("(" + innerQuery + ")", applyQuotes("pagination_subquery", sqlDialect), sqlDialect)).build();
}
use of com.yahoo.elide.datastores.aggregation.metadata.models.Metric in project elide by yahoo.
the class MetaDataStoreTest method testHiddenFields.
@Test
public void testHiddenFields() {
Table playerStats = dataStore.getTable(ClassType.of(PlayerStats.class));
Dimension country = playerStats.getDimension("country");
Dimension playerRank = playerStats.getDimension("playerRank");
Metric highScore = playerStats.getMetric("highScore");
Metric hiddenHighScore = playerStats.getMetric("hiddenHighScore");
TimeDimension recordedDate = playerStats.getTimeDimension("recordedDate");
TimeDimension hiddenRecordedDate = playerStats.getTimeDimension("hiddenRecordedDate");
assertTrue(country.isHidden());
assertFalse(playerRank.isHidden());
assertTrue(hiddenHighScore.isHidden());
assertFalse(highScore.isHidden());
assertTrue(hiddenRecordedDate.isHidden());
assertFalse(recordedDate.isHidden());
assertTrue(playerStats.getColumns().contains(highScore));
assertTrue(playerStats.getColumns().contains(recordedDate));
assertTrue(playerStats.getColumns().contains(playerRank));
assertFalse(playerStats.getColumns().contains(country));
assertFalse(playerStats.getColumns().contains(hiddenHighScore));
assertFalse(playerStats.getColumns().contains(hiddenRecordedDate));
assertTrue(playerStats.getAllColumns().contains(highScore));
assertTrue(playerStats.getAllColumns().contains(recordedDate));
assertTrue(playerStats.getAllColumns().contains(playerRank));
assertTrue(playerStats.getAllColumns().contains(country));
assertTrue(playerStats.getAllColumns().contains(hiddenHighScore));
assertTrue(playerStats.getAllColumns().contains(hiddenRecordedDate));
assertFalse(playerStats.getDimensions().contains(country));
assertFalse(playerStats.getMetrics().contains(hiddenHighScore));
assertFalse(playerStats.getTimeDimensions().contains(hiddenRecordedDate));
assertTrue(playerStats.getMetrics().contains(highScore));
assertTrue(playerStats.getDimensions().contains(playerRank));
assertTrue(playerStats.getTimeDimensions().contains(recordedDate));
assertTrue(playerStats.getAllDimensions().contains(country));
assertTrue(playerStats.getAllMetrics().contains(hiddenHighScore));
assertTrue(playerStats.getAllTimeDimensions().contains(hiddenRecordedDate));
assertTrue(playerStats.getAllMetrics().contains(highScore));
assertTrue(playerStats.getAllDimensions().contains(playerRank));
assertTrue(playerStats.getAllTimeDimensions().contains(recordedDate));
}
use of com.yahoo.elide.datastores.aggregation.metadata.models.Metric in project elide by yahoo.
the class SQLQueryEngine method expandMetricQueryPlans.
/**
* Transforms a client query into a potentially nested/complex query by expanding each metric into
* its respective query plan - and then merging the plans together into a consolidated query.
* @param query The client query.
* @return A query that reflects each metric's individual query plan.
*/
private Query expandMetricQueryPlans(Query query) {
// Expand each metric into its own query plan.
List<QueryPlan> toMerge = query.getMetricProjections().stream().map(projection -> projection.resolve(query)).collect(Collectors.toList());
// Merge all the queries together.
List<QueryPlan> mergedPlans = merger.merge(toMerge);
// TODO - Support joins across plans rather than rejecting plans that don't merge.
if (mergedPlans.size() != 1) {
throw new UnsupportedOperationException("Incompatible metrics in client query. Cannot merge " + "into a single query");
}
QueryPlan mergedPlan = mergedPlans.get(0);
QueryPlanTranslator queryPlanTranslator = new QueryPlanTranslator(query, metaDataStore, merger);
Query merged = (mergedPlan == null) ? QueryPlanTranslator.addHiddenProjections(metaDataStore, query).build() : queryPlanTranslator.translate(mergedPlan);
for (Optimizer optimizer : optimizers) {
SQLTable table = (SQLTable) query.getSource();
// override table hints.
if (table.getHints().contains(optimizer.negateHint())) {
continue;
}
if (!table.getHints().contains(optimizer.hint())) {
continue;
}
if (optimizer.canOptimize(merged)) {
merged = optimizer.optimize(merged);
}
}
return merged;
}
Aggregations