You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by kr...@apache.org on 2016/05/04 22:10:39 UTC
lucene-solr:jira/solr-8593: Updated rules
Repository: lucene-solr
Updated Branches:
refs/heads/jira/solr-8593 5daf6c40d -> 5d2994dfb
Updated rules
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/5d2994df
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/5d2994df
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/5d2994df
Branch: refs/heads/jira/solr-8593
Commit: 5d2994dfbf5cb13c1cdb2b52985eca3056b72074
Parents: 5daf6c4
Author: Kevin Risden <kr...@apache.org>
Authored: Wed May 4 17:10:37 2016 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Wed May 4 17:10:37 2016 -0500
----------------------------------------------------------------------
.../apache/solr/handler/sql/SolrAggregate.java | 24 ++++++++++++--------
.../org/apache/solr/handler/sql/SolrRel.java | 4 ++--
.../org/apache/solr/handler/sql/SolrRules.java | 21 +++++++++++++++++
3 files changed, 37 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5d2994df/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
index aed2e33..02b50c5 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
@@ -67,36 +67,40 @@ class SolrAggregate extends Aggregate implements SolrRel {
final List<String> inNames = SolrRules.solrFieldNames(getInput().getRowType());
final List<String> outNames = SolrRules.solrFieldNames(getRowType());
- List<Pair<String, String>> metrics = new ArrayList<>();
Map<String, String> fieldMappings = new HashMap<>();
for(AggregateCall aggCall : aggCalls) {
- Pair<String, String> metric = toSolrMetric(aggCall.getAggregation(), inNames, aggCall.getArgList());
- metrics.add(metric);
+ Pair<String, String> metric = toSolrMetric(implementor, aggCall, inNames);
+ implementor.addMetric(metric);
fieldMappings.put(aggCall.getName(), metric.getKey().toLowerCase(Locale.ROOT) + "(" + metric.getValue() + ")");
}
List<String> buckets = new ArrayList<>();
for(int group : groupSet) {
- final String inName = inNames.get(group);
- buckets.add(inName);
- fieldMappings.put(inName, inName);
+ String inName = inNames.get(group);
+ String name = implementor.fieldMappings.getOrDefault(inName, inName);
+ buckets.add(name);
+ if(!fieldMappings.containsKey(name)) {
+ fieldMappings.put(name, name);
+ }
}
implementor.addBuckets(buckets);
- implementor.addMetrics(metrics);
implementor.addFieldMappings(fieldMappings);
}
- private Pair<String, String> toSolrMetric(SqlAggFunction aggregation, List<String> inNames, List<Integer> args) {
+ private Pair<String, String> toSolrMetric(Implementor implementor, AggregateCall aggCall, List<String> inNames) {
+ SqlAggFunction aggregation = aggCall.getAggregation();
+ List<Integer> args = aggCall.getArgList();
switch (args.size()) {
case 0:
if (aggregation.equals(SqlStdOperatorTable.COUNT)) {
return new Pair<>(aggregation.getName(), "*");
}
case 1:
- final String inName = inNames.get(args.get(0));
+ String inName = inNames.get(args.get(0));
+ String name = implementor.fieldMappings.getOrDefault(inName, inName);
if(SUPPORTED_AGGREGATIONS.contains(aggregation)) {
- return new Pair<>(aggregation.getName(), inName);
+ return new Pair<>(aggregation.getName(), name);
}
default:
throw new AssertionError("Invalid aggregation " + aggregation + " with args " + args + " with names" + inNames);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5d2994df/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
index 5b67627..5a2ab6f 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
@@ -68,8 +68,8 @@ interface SolrRel extends RelNode {
this.buckets.addAll(buckets);
}
- void addMetrics(List<Pair<String, String>> metrics) {
- this.metricPairs.addAll(metrics);
+ void addMetric(Pair<String, String> metricPair) {
+ this.metricPairs.add(metricPair);
}
void setLimit(String limit) {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5d2994df/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
index a2d9eb1..a48effd 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
@@ -29,12 +29,15 @@ import org.apache.calcite.rel.logical.LogicalAggregate;
import org.apache.calcite.rel.logical.LogicalFilter;
import org.apache.calcite.rel.logical.LogicalProject;
import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rex.RexCall;
import org.apache.calcite.rex.RexInputRef;
import org.apache.calcite.rex.RexNode;
import org.apache.calcite.rex.RexVisitorImpl;
+import org.apache.calcite.sql.SqlKind;
import org.apache.calcite.sql.validate.SqlValidatorUtil;
import java.util.AbstractList;
+import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
@@ -81,6 +84,24 @@ class SolrRules {
public String visitInputRef(RexInputRef inputRef) {
return inFields.get(inputRef.getIndex());
}
+
+ @Override
+ public String visitCall(RexCall call) {
+ final List<String> strings = visitList(call.operands);
+ if (call.getKind() == SqlKind.CAST) {
+ return strings.get(0);
+ }
+
+ return super.visitCall(call);
+ }
+
+ private List<String> visitList(List<RexNode> list) {
+ final List<String> strings = new ArrayList<>();
+ for (RexNode node : list) {
+ strings.add(node.accept(this));
+ }
+ return strings;
+ }
}
/** Base class for planner rules that convert a relational expression to Solr calling convention. */