Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id E002F200B9A for ; Sat, 8 Oct 2016 00:02:48 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id DE9AF160AE9; Fri, 7 Oct 2016 22:02:48 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 00FF8160AE8 for ; Sat, 8 Oct 2016 00:02:47 +0200 (CEST) Received: (qmail 56908 invoked by uid 500); 7 Oct 2016 22:02:47 -0000 Mailing-List: contact commits-help@calcite.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@calcite.apache.org Delivered-To: mailing list commits@calcite.apache.org Received: (qmail 56898 invoked by uid 99); 7 Oct 2016 22:02:47 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 07 Oct 2016 22:02:47 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id EEEC8E00DB; Fri, 7 Oct 2016 22:02:46 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: jcamacho@apache.org To: commits@calcite.apache.org Message-Id: <0a19c37092264527be89504cacb51987@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: calcite git commit: [CALCITE-1402] Druid Filter translation incorrect if input reference is in RHS of comparison Date: Fri, 7 Oct 2016 22:02:46 +0000 (UTC) archived-at: Fri, 07 Oct 2016 22:02:49 -0000 Repository: calcite Updated Branches: refs/heads/master c7e0ff2e0 -> 55ecc709c [CALCITE-1402] Druid Filter translation incorrect if input reference is in RHS of comparison Project: http://git-wip-us.apache.org/repos/asf/calcite/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/55ecc709 Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/55ecc709 Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/55ecc709 Branch: refs/heads/master Commit: 55ecc709cf1b133a36f68347730cbdcc408d3193 Parents: c7e0ff2 Author: Jesus Camacho Rodriguez Authored: Thu Sep 29 15:20:20 2016 +0100 Committer: Jesus Camacho Rodriguez Committed: Fri Oct 7 23:01:38 2016 +0100 ---------------------------------------------------------------------- .../calcite/adapter/druid/DruidQuery.java | 49 ++++++++++++++------ .../org/apache/calcite/test/DruidAdapterIT.java | 13 ++++++ 2 files changed, 48 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/55ecc709/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java ---------------------------------------------------------------------- diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java index fb48557..b5d6e30 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java @@ -50,6 +50,7 @@ import org.apache.calcite.rex.RexCall; import org.apache.calcite.rex.RexInputRef; import org.apache.calcite.rex.RexLiteral; import org.apache.calcite.rex.RexNode; +import org.apache.calcite.rex.RexUtil; import org.apache.calcite.runtime.Hook; import org.apache.calcite.schema.ScannableTable; import org.apache.calcite.sql.type.SqlTypeName; @@ -834,35 +835,55 @@ public class DruidQuery extends AbstractRelNode implements BindableRel { } } - private JsonFilter translateFilter(RexNode e) { + @SuppressWarnings("incomplete-switch") private JsonFilter translateFilter(RexNode e) { final RexCall call; switch (e.getKind()) { case EQUALS: - return new JsonSelector("selector", tr(e, 0), tr(e, 1)); case NOT_EQUALS: - return new JsonCompositeFilter("not", - ImmutableList.of(new JsonSelector("selector", tr(e, 0), tr(e, 1)))); case GREATER_THAN: - return new JsonBound("bound", tr(e, 0), tr(e, 1), true, null, false, - false); case GREATER_THAN_OR_EQUAL: - return new JsonBound("bound", tr(e, 0), tr(e, 1), false, null, false, - false); case LESS_THAN: - return new JsonBound("bound", tr(e, 0), null, false, tr(e, 1), true, - false); case LESS_THAN_OR_EQUAL: - return new JsonBound("bound", tr(e, 0), null, false, tr(e, 1), false, - false); + call = (RexCall) e; + int posRef; + int posConstant; + if (RexUtil.isConstant(call.getOperands().get(1))) { + posRef = 0; + posConstant = 1; + } else if (RexUtil.isConstant(call.getOperands().get(0))) { + posRef = 1; + posConstant = 0; + } else { + throw new AssertionError("it is not a valid comparison: " + e); + } + switch (e.getKind()) { + case EQUALS: + return new JsonSelector("selector", tr(e, posRef), tr(e, posConstant)); + case NOT_EQUALS: + return new JsonCompositeFilter("not", + ImmutableList.of(new JsonSelector("selector", tr(e, posRef), tr(e, posConstant)))); + case GREATER_THAN: + return new JsonBound("bound", tr(e, posRef), tr(e, posConstant), true, null, false, + false); + case GREATER_THAN_OR_EQUAL: + return new JsonBound("bound", tr(e, posRef), tr(e, posConstant), false, null, false, + false); + case LESS_THAN: + return new JsonBound("bound", tr(e, posRef), null, false, tr(e, posConstant), true, + false); + case LESS_THAN_OR_EQUAL: + return new JsonBound("bound", tr(e, posRef), null, false, tr(e, posConstant), false, + false); + } + break; case AND: case OR: case NOT: call = (RexCall) e; return new JsonCompositeFilter(e.getKind().toString().toLowerCase(), translateFilters(call.getOperands())); - default: - throw new AssertionError("cannot translate filter: " + e); } + throw new AssertionError("cannot translate filter: " + e); } private String tr(RexNode call, int index) { http://git-wip-us.apache.org/repos/asf/calcite/blob/55ecc709/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java ---------------------------------------------------------------------- diff --git a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java index 6173211..f88d8fb 100644 --- a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java +++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java @@ -928,6 +928,19 @@ public class DruidAdapterIT { .returnsUnordered("C=6588"); } + @Test public void testFilterSwapped() { + String sql = "select \"state_province\"\n" + + "from \"foodmart\"\n" + + "where 'High Top Dried Mushrooms' = \"product_name\""; + final String explain = "EnumerableInterpreter\n" + + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], filter=[=('High Top Dried Mushrooms', CAST($3):VARCHAR(24) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\")], projects=[[$30]])"; + final String druidQuery = "'filter':{'type':'selector','dimension':'product_name'," + + "'value':'High Top Dried Mushrooms'}"; + sql(sql) + .explainContains(explain) + .queryContains(druidChecker(druidQuery)); + } + /** Tests a query that exposed several bugs in the interpreter. */ @Test public void testWhereGroupBy() { String sql = "select \"wikiticker\".\"countryName\" as \"c0\",\n"