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. */