[
https://issues.apache.org/jira/browse/SOLR-8593?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15662327#comment-15662327
]
Cao Manh Dat commented on SOLR-8593:
------------------------------------
Thanks [~julianhyde], that make sense, but will Calcite have an option for that
in the future? Because along with JDBC API, we also support query through REST
API.
For example
{code}
curl --data-urlencode 'stmt=SELECT to, count(*) FROM collection4 GROUP BY to
ORDER BY count(*) desc LIMIT 10'
http://localhost:8983/solr/collection4/sql?aggregationMode=facet
{code}
Below is sample result set:
{code}
{"result-set":{"docs":[
{"count(*)":9158,"to":"[email protected]"},
{"count(*)":6244,"to":"[email protected]"},
{"count(*)":5874,"to":"[email protected]"},
{"count(*)":5867,"to":"[email protected]"},
{"count(*)":5595,"to":"[email protected]"},
{"count(*)":4904,"to":"[email protected]"},
{"count(*)":4622,"to":"[email protected]"},
{"count(*)":3819,"to":"[email protected]"},
{"count(*)":3678,"to":"[email protected]"},
{"count(*)":3653,"to":"[email protected]"},
{"EOF":"true","RESPONSE_TIME":10}]}
}
{code}
So "EXPR$1" is kinda weird as a field name.
I also want to ask another question, right now we rely on Calcite in memory
filter to filter expr in having clause ( as {{ having sum(field_i) = 19 }} in
below query
{code}
select str_s, count(*) as myCount, sum(field_i), min(field_i), max(field_i),
cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by
str_s having sum(field_i) = 19 order by sum(field_i) asc
{code}
So I created a filter predicate for convert LogicalFilter to SolrFilter like
this
{code}
private static final boolean isNotFilterByExpr (List<RexNode> rexNodes,
List<String> fieldNames) {
// We dont have a way to filter by result of aggregator now
boolean result = true;
for (RexNode rexNode : rexNodes) {
if (rexNode instanceof RexCall) {
result = result && isNotFilterByExpr(((RexCall) rexNode).getOperands(),
fieldNames);
} else if (rexNode instanceof RexInputRef) {
result = result && !fieldNames.get(((RexInputRef)
rexNode).getIndex()).startsWith("EXPR$");
}
}
return result;
}
private static final Predicate<RelNode> FILTER_PREDICATE = relNode -> {
List<RexNode> filterOperands = ((RexCall) ((LogicalFilter)
relNode).getCondition()).getOperands();
return isNotFilterByExpr(filterOperands,
SolrRules.solrFieldNames(relNode.getRowType()));
};
{code}
But the above code is not works when I add alias for sum(field_i) like this
{code}
select str_s, count(*) as myCount, sum(field_i) as mySum, min(field_i),
max(field_i), cast(avg(1.0 * field_i) as float) from collection1 where
text='XXXX' group by str_s having sum(field_i) = 19 order by sum(field_i) asc
{code}
So do Calcite have a way to check for RexInputRef is an alias or not?
> Integrate Apache Calcite into the SQLHandler
> --------------------------------------------
>
> Key: SOLR-8593
> URL: https://issues.apache.org/jira/browse/SOLR-8593
> Project: Solr
> Issue Type: Improvement
> Reporter: Joel Bernstein
> Assignee: Joel Bernstein
> Attachments: SOLR-8593.patch
>
>
> The Presto SQL Parser was perfect for phase one of the SQLHandler. It was
> nicely split off from the larger Presto project and it did everything that
> was needed for the initial implementation.
> Phase two of the SQL work though will require an optimizer. Here is where
> Apache Calcite comes into play. It has a battle tested cost based optimizer
> and has been integrated into Apache Drill and Hive.
> This work can begin in trunk following the 6.0 release. The final query plans
> will continue to be translated to Streaming API objects (TupleStreams), so
> continued work on the JDBC driver should plug in nicely with the Calcite work.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]