use of com.yahoo.elide.core.Path in project elide by yahoo.
the class DefaultFilterDialect method extractPredicates.
/**
* Converts the query parameters to a list of predicates that are then conjoined or organized by type.
*
* @param queryParams the query params
* @return a list of the predicates from the query params
* @throws ParseException when a filter parameter cannot be parsed
*/
private List<FilterPredicate> extractPredicates(MultivaluedMap<String, String> queryParams, String apiVersion) throws ParseException {
List<FilterPredicate> filterPredicates = new ArrayList<>();
Pattern pattern = Pattern.compile("filter\\[([^\\]]+)\\](\\[([^\\]]+)\\])?");
for (MultivaluedMap.Entry<String, List<String>> entry : queryParams.entrySet()) {
// Match "filter[<type>.<field>]" OR "filter[<type>.<field>][<operator>]"
String paramName = entry.getKey();
List<String> paramValues = entry.getValue();
Matcher matcher = pattern.matcher(paramName);
if (!matcher.find()) {
throw new ParseException("Invalid filter format: " + paramName);
}
final String[] keyParts = matcher.group(1).split("\\.");
if (keyParts.length < 2) {
throw new ParseException("Invalid filter format: " + paramName);
}
final Operator operator = (matcher.group(3) == null) ? Operator.IN : Operator.fromString(matcher.group(3));
Path path = getPath(keyParts, apiVersion);
List<Path.PathElement> elements = path.getPathElements();
Path.PathElement last = elements.get(elements.size() - 1);
final List<Object> values = new ArrayList<>();
if (operator.isParameterized()) {
for (String valueParams : paramValues) {
for (String valueParam : valueParams.split(",")) {
values.add(CoerceUtil.coerce(valueParam, last.getFieldType()));
}
}
}
FilterPredicate filterPredicate = new FilterPredicate(path, operator, values);
filterPredicates.add(filterPredicate);
}
return filterPredicates;
}
use of com.yahoo.elide.core.Path in project elide by yahoo.
the class AggregateBeforeJoinOptimizerTest method testWhereOnDimensionInProjectionNotRequiringJoin.
@Test
public void testWhereOnDimensionInProjectionNotRequiringJoin() {
SQLTable gameRevenueTable = (SQLTable) metaDataStore.getTable("gameRevenue", NO_VERSION);
FilterExpression having = new FilterPredicate(new Path(GameRevenue.class, dictionary, "revenue"), Operator.GT, Arrays.asList(9000));
FilterExpression where = new FilterPredicate(new Path(GameRevenue.class, dictionary, "category"), Operator.IN, Arrays.asList("foo"));
Query query = Query.builder().source(gameRevenueTable).metricProjection(gameRevenueTable.getMetricProjection("revenue")).dimensionProjection(gameRevenueTable.getDimensionProjection("countryIsoCode")).dimensionProjection(gameRevenueTable.getDimensionProjection("category")).havingFilter(having).whereFilter(where).build();
String expected = "SELECT MAX(`example_GameRevenue_XXX`.`INNER_AGG_XXX`) AS `revenue`," + "`example_GameRevenue_XXX_country_XXX`.`iso_code` AS `countryIsoCode`," + "`example_GameRevenue_XXX`.`category` AS `category` " + "FROM (SELECT MAX(`example_GameRevenue`.`revenue`) AS `INNER_AGG_XXX`," + "`example_GameRevenue`.`country_id` AS `country_id`," + "`example_GameRevenue`.`category` AS `category` " + "FROM `gameRevenue` AS `example_GameRevenue` " + "WHERE `example_GameRevenue`.`category` IN (:XXX) " + "GROUP BY `example_GameRevenue`.`country_id`, " + "`example_GameRevenue`.`category` ) " + "AS `example_GameRevenue_XXX` " + "LEFT OUTER JOIN `countries` AS `example_GameRevenue_XXX_country_XXX` " + "ON `example_GameRevenue_XXX`.`country_id` = `example_GameRevenue_XXX_country_XXX`.`id` " + "GROUP BY `example_GameRevenue_XXX_country_XXX`.`iso_code`, " + "`example_GameRevenue_XXX`.`category` " + "HAVING MAX(`example_GameRevenue_XXX`.`INNER_AGG_XXX`) > :XXX\n";
compareQueryLists(expected, engine.explain(query));
testQueryExecution(query);
}
use of com.yahoo.elide.core.Path in project elide by yahoo.
the class AggregateBeforeJoinOptimizerTest method testHavingOnTimeDimensionInProjectionNotRequiringJoin.
@Test
public void testHavingOnTimeDimensionInProjectionNotRequiringJoin() {
SQLTable gameRevenueTable = (SQLTable) metaDataStore.getTable("gameRevenue", NO_VERSION);
FilterExpression expression = new OrFilterExpression(new FilterPredicate(new Path(GameRevenue.class, dictionary, "revenue"), Operator.GT, Arrays.asList(9000)), new FilterPredicate(new Path(GameRevenue.class, dictionary, "saleDate"), Operator.IN, Arrays.asList(new Day(new Date()))));
Query query = Query.builder().source(gameRevenueTable).metricProjection(gameRevenueTable.getMetricProjection("revenue")).dimensionProjection(gameRevenueTable.getDimensionProjection("countryIsoCode")).timeDimensionProjection(gameRevenueTable.getTimeDimensionProjection("saleDate")).havingFilter(expression).build();
compareQueryLists("SELECT MAX(`example_GameRevenue_XXX`.`INNER_AGG_XXX`) AS `revenue`," + "`example_GameRevenue_XXX_country_XXX`.`iso_code` AS `countryIsoCode`," + "`example_GameRevenue_XXX`.`saleDate` AS `saleDate` " + "FROM (SELECT MAX(`example_GameRevenue`.`revenue`) AS `INNER_AGG_XXX`," + "`example_GameRevenue`.`country_id` AS `country_id`," + "PARSEDATETIME(FORMATDATETIME(`example_GameRevenue`.`saleDate`, 'yyyy-MM-dd'), 'yyyy-MM-dd') AS `saleDate` " + "FROM `gameRevenue` AS `example_GameRevenue` " + "GROUP BY `example_GameRevenue`.`country_id`, " + "PARSEDATETIME(FORMATDATETIME(`example_GameRevenue`.`saleDate`, 'yyyy-MM-dd'), 'yyyy-MM-dd') ) " + "AS `example_GameRevenue_XXX` " + "LEFT OUTER JOIN `countries` AS `example_GameRevenue_XXX_country_XXX` " + "ON `example_GameRevenue_XXX`.`country_id` = `example_GameRevenue_XXX_country_XXX`.`id` " + "GROUP BY `example_GameRevenue_XXX_country_XXX`.`iso_code`, " + "`example_GameRevenue_XXX`.`saleDate` " + "HAVING (MAX(`example_GameRevenue_XXX`.`INNER_AGG_XXX`) > :XXX " + "OR `example_GameRevenue_XXX`.`saleDate` IN (:XXX))\n", engine.explain(query));
testQueryExecution(query);
}
use of com.yahoo.elide.core.Path in project elide by yahoo.
the class QueryEngineTest method testFilterByTemporalDimension.
/**
* Test filter by time dimension.
*
* @throws Exception exception
*/
@Test
public void testFilterByTemporalDimension() throws Exception {
FilterPredicate predicate = new FilterPredicate(new Path(PlayerStats.class, dictionary, "recordedDate"), Operator.IN, Lists.newArrayList(new Day(Date.valueOf("2019-07-11"))));
Query query = Query.builder().source(playerStatsTable).metricProjection(playerStatsTable.getMetricProjection("highScore")).timeDimensionProjection(playerStatsTable.getTimeDimensionProjection("recordedDate")).whereFilter(predicate).build();
List<Object> results = toList(engine.executeQuery(query, transaction).getData());
PlayerStats stats0 = new PlayerStats();
stats0.setId("0");
stats0.setHighScore(2412);
stats0.setRecordedDate(new Day(Date.valueOf("2019-07-11")));
assertEquals(ImmutableList.of(stats0), results);
}
use of com.yahoo.elide.core.Path in project elide by yahoo.
the class AggregateBeforeJoinOptimizerTest method testWhereOnMultiReferenceDimensionInProjection.
@Test
public void testWhereOnMultiReferenceDimensionInProjection() {
SQLTable gameRevenueTable = (SQLTable) metaDataStore.getTable("gameRevenue", NO_VERSION);
FilterExpression where = new AndFilterExpression(new FilterPredicate(new Path(GameRevenue.class, dictionary, "countryIsoCode"), Operator.IN, Arrays.asList("foo")), new FilterPredicate(new Path(GameRevenue.class, dictionary, "countryCategory"), Operator.IN, Arrays.asList("US")));
Query query = Query.builder().source(gameRevenueTable).metricProjection(gameRevenueTable.getMetricProjection("revenue")).dimensionProjection(gameRevenueTable.getDimensionProjection("countryCategory")).whereFilter(where).build();
String expected = "SELECT MAX(`example_GameRevenue_XXX`.`INNER_AGG_XXX`) AS `revenue`," + "CASE WHEN `example_GameRevenue_XXX_country_XXX`.`iso_code` = 'US' THEN `example_GameRevenue_XXX`.`category` ELSE 'UNKNONWN' END AS `countryCategory` " + "FROM (SELECT MAX(`example_GameRevenue`.`revenue`) AS `INNER_AGG_XXX`," + "`example_GameRevenue`.`country_id` AS `country_id`," + "`example_GameRevenue`.`category` AS `category` " + "FROM `gameRevenue` AS `example_GameRevenue` " + "GROUP BY `example_GameRevenue`.`country_id`, " + "`example_GameRevenue`.`category` ) " + "AS `example_GameRevenue_XXX` " + "LEFT OUTER JOIN `countries` AS `example_GameRevenue_XXX_country_XXX` " + "ON `example_GameRevenue_XXX`.`country_id` = `example_GameRevenue_XXX_country_XXX`.`id` " + "WHERE (`example_GameRevenue_XXX_country_XXX`.`iso_code` IN (:XXX) " + "AND CASE WHEN `example_GameRevenue_XXX_country_XXX`.`iso_code` = 'US' THEN `example_GameRevenue_XXX`.`category` ELSE 'UNKNONWN' END IN (:XXX)) " + "GROUP BY CASE WHEN `example_GameRevenue_XXX_country_XXX`.`iso_code` = 'US' THEN `example_GameRevenue_XXX`.`category` ELSE 'UNKNONWN' END\n";
compareQueryLists(expected, engine.explain(query));
testQueryExecution(query);
}
Aggregations