You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by GitBox <gi...@apache.org> on 2022/07/17 14:17:41 UTC

[GitHub] [doris] yinzhijian opened a new pull request, #10947: [enhancement](nereids) support case when for TPC-H

yinzhijian opened a new pull request, #10947:
URL: https://github.com/apache/doris/pull/10947

   # Proposed changes
   
   Issue Number: close #xxx
   
   ## Problem Summary:
   support case when for TPC-H
   for example:
   CASE [expression] WHEN [value] THEN [expression] ... ELSE [expression] END
   or
   CASE  WHEN [predicate] THEN [expression] ... ELSE [expression] END
   ## Checklist(Required)
   
   1. Does it affect the original behavior: (No)
   2. Has unit tests been added: (Yes)
   3. Has document been added or modified: (No Need)
   4. Does it need to update dependencies: (No)
   5. Are there any changes that cannot be rolled back: (No)
   
   ## Further comments
   
   If this is a relatively large or complex change, kick off the discussion at [dev@doris.apache.org](mailto:dev@doris.apache.org) by explaining why you chose the solution you did and what alternatives you considered, etc...
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


[GitHub] [doris] qzsee commented on a diff in pull request #10947: [enhancement](nereids) support case when for TPC-H

Posted by GitBox <gi...@apache.org>.
qzsee commented on code in PR #10947:
URL: https://github.com/apache/doris/pull/10947#discussion_r926224908


##########
fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/ExpressionParserTest.java:
##########
@@ -137,4 +137,13 @@ public void testSortClause() throws Exception {
         String sort1 = "select a from test order by 1";
         assertSql(sort1);
     }
+
+    @Test
+    public void testCaseWhen() throws Exception {
+        String caseWhen = "select case a when 1 then 2 else 3 end from test";
+        assertSql(caseWhen);
+
+        String caseWhen2 = "select case when a = 1 then 2 else 3 end from test";

Review Comment:
   I think should another add some ut case. add complex expr after then and else?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


[GitHub] [doris] morrySnow commented on a diff in pull request #10947: [enhancement](nereids) support case when for TPC-H

Posted by GitBox <gi...@apache.org>.
morrySnow commented on code in PR #10947:
URL: https://github.com/apache/doris/pull/10947#discussion_r923267488


##########
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/WhenClause.java:
##########
@@ -0,0 +1,91 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.expressions;
+
+import org.apache.doris.nereids.exceptions.UnboundException;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.DataType;
+
+import com.google.common.base.Preconditions;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * captures info of a single WHEN expr THEN expr clause.
+ */
+public class WhenClause extends Expression implements BinaryExpression {
+    public WhenClause(Expression operand, Expression result) {
+        super(ExpressionType.WHEN_CLAUSE, operand, result);
+    }
+
+    @Override
+    public String toSql() {
+        return "when " + left().toSql() + " then " + right().toSql();

Review Comment:
   nit:
   ```suggestion
           return "WHEN " + left().toSql() + " THEN " + right().toSql();
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


[GitHub] [doris] github-actions[bot] commented on pull request #10947: [enhancement](nereids) support case when for TPC-H

Posted by GitBox <gi...@apache.org>.
github-actions[bot] commented on PR #10947:
URL: https://github.com/apache/doris/pull/10947#issuecomment-1191007252

   PR approved by at least one committer and no changes requested.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


[GitHub] [doris] morrySnow commented on a diff in pull request #10947: [enhancement](nereids) support case when for TPC-H

Posted by GitBox <gi...@apache.org>.
morrySnow commented on code in PR #10947:
URL: https://github.com/apache/doris/pull/10947#discussion_r923272111


##########
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/CaseWhen.java:
##########
@@ -0,0 +1,122 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.expressions;
+
+import org.apache.doris.nereids.exceptions.UnboundException;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.DataType;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * The internal representation of
+ * CASE [expr] WHEN expr THEN expr [WHEN expr THEN expr ...] [ELSE expr] END
+ * Each When/Then is stored as two consecutive children (whenExpr, thenExpr).
+ * If a case expr is given, convert it to equalTo(caseExpr, whenExpr) and set it to whenExpr.
+ * If an else expr is given then it is the last child.
+ */
+public class CaseWhen extends Expression {
+    public CaseWhen(List<WhenClause> whenClauses) {
+        super(ExpressionType.CASE, whenClauses.toArray(new Expression[0]));
+    }
+
+    public CaseWhen(List<WhenClause> whenClauses, Expression defaultValue) {
+        super(ExpressionType.CASE,
+                ImmutableList.builder().addAll(whenClauses).add(defaultValue).build().toArray(new Expression[0]));
+    }
+
+    public List<WhenClause> getWhenClauses() {
+        List<WhenClause> whenClauses = children().stream()
+                .filter(e -> e instanceof WhenClause)
+                .map(e -> (WhenClause) e)
+                .collect(Collectors.toList());
+        return whenClauses;
+    }
+
+    public Optional<Expression> getDefaultValue() {
+        int lastIndex = children.size() - 1;

Review Comment:
   maybe use a attribute to record default result offset is better



##########
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/CaseWhen.java:
##########
@@ -0,0 +1,122 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.expressions;
+
+import org.apache.doris.nereids.exceptions.UnboundException;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.DataType;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * The internal representation of
+ * CASE [expr] WHEN expr THEN expr [WHEN expr THEN expr ...] [ELSE expr] END
+ * Each When/Then is stored as two consecutive children (whenExpr, thenExpr).
+ * If a case expr is given, convert it to equalTo(caseExpr, whenExpr) and set it to whenExpr.
+ * If an else expr is given then it is the last child.
+ */
+public class CaseWhen extends Expression {
+    public CaseWhen(List<WhenClause> whenClauses) {
+        super(ExpressionType.CASE, whenClauses.toArray(new Expression[0]));
+    }
+
+    public CaseWhen(List<WhenClause> whenClauses, Expression defaultValue) {
+        super(ExpressionType.CASE,
+                ImmutableList.builder().addAll(whenClauses).add(defaultValue).build().toArray(new Expression[0]));
+    }
+
+    public List<WhenClause> getWhenClauses() {
+        List<WhenClause> whenClauses = children().stream()
+                .filter(e -> e instanceof WhenClause)
+                .map(e -> (WhenClause) e)
+                .collect(Collectors.toList());
+        return whenClauses;
+    }
+
+    public Optional<Expression> getDefaultValue() {
+        int lastIndex = children.size() - 1;
+        if (child(lastIndex) instanceof WhenClause) {
+            return Optional.empty();
+        }
+        return Optional.of(child(lastIndex));
+    }
+
+    public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
+        return visitor.visitCaseWhen(this, context);
+    }
+
+    @Override
+    public DataType getDataType() {
+        return child(0).getDataType();
+    }
+
+    @Override
+    public boolean nullable() {
+        for (Expression child : children()) {
+            if (child.nullable()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toSql();
+    }
+
+    @Override
+    public String toSql() throws UnboundException {
+        StringBuilder output = new StringBuilder("case");

Review Comment:
   ```suggestion
           StringBuilder output = new StringBuilder("CASE ");
   ```



##########
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/WhenClause.java:
##########
@@ -0,0 +1,91 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.expressions;
+
+import org.apache.doris.nereids.exceptions.UnboundException;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.DataType;
+
+import com.google.common.base.Preconditions;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * captures info of a single WHEN expr THEN expr clause.
+ */
+public class WhenClause extends Expression implements BinaryExpression {
+    public WhenClause(Expression operand, Expression result) {
+        super(ExpressionType.WHEN_CLAUSE, operand, result);
+    }
+
+    @Override
+    public String toSql() {
+        return "when " + left().toSql() + " then " + right().toSql();

Review Comment:
   nit:
   ```suggestion
           return "WHEN " + left().toSql() + " THEN " + right().toSql();
   ```



##########
fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java:
##########
@@ -213,6 +218,23 @@ public Expr visitStringRegexPredicate(StringRegexPredicate stringRegexPredicate,
                 stringRegexPredicate.right().accept(this, context));
     }
 
+    @Override
+    public Expr visitCaseWhen(CaseWhen caseWhen, PlanTranslatorContext context) {
+        List<CaseWhenClause> caseWhenClauses = new ArrayList<>();
+        for (WhenClause whenClause : caseWhen.getWhenClauses()) {
+            caseWhenClauses.add(new CaseWhenClause(
+                    whenClause.left().accept(this, context),
+                    whenClause.right().accept(this, context)
+            ));
+        }
+        Expr elseExpr = null;
+        Optional<Expression> defaultValue = caseWhen.getDefaultValue();

Review Comment:
   nit: Optional is unnecessary



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


[GitHub] [doris] 924060929 commented on a diff in pull request #10947: [enhancement](nereids) support case when for TPC-H

Posted by GitBox <gi...@apache.org>.
924060929 commented on code in PR #10947:
URL: https://github.com/apache/doris/pull/10947#discussion_r926231893


##########
fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/ExpressionParserTest.java:
##########
@@ -137,4 +137,13 @@ public void testSortClause() throws Exception {
         String sort1 = "select a from test order by 1";
         assertSql(sort1);
     }
+
+    @Test
+    public void testCaseWhen() throws Exception {
+        String caseWhen = "select case a when 1 then 2 else 3 end from test";
+        assertSql(caseWhen);
+
+        String caseWhen2 = "select case when a = 1 then 2 else 3 end from test";

Review Comment:
   @yinzhijian add ut later



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


[GitHub] [doris] morrySnow commented on a diff in pull request #10947: [enhancement](nereids) support case when for TPC-H

Posted by GitBox <gi...@apache.org>.
morrySnow commented on code in PR #10947:
URL: https://github.com/apache/doris/pull/10947#discussion_r923277657


##########
fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java:
##########
@@ -213,6 +218,23 @@ public Expr visitStringRegexPredicate(StringRegexPredicate stringRegexPredicate,
                 stringRegexPredicate.right().accept(this, context));
     }
 
+    @Override
+    public Expr visitCaseWhen(CaseWhen caseWhen, PlanTranslatorContext context) {
+        List<CaseWhenClause> caseWhenClauses = new ArrayList<>();
+        for (WhenClause whenClause : caseWhen.getWhenClauses()) {
+            caseWhenClauses.add(new CaseWhenClause(
+                    whenClause.left().accept(this, context),
+                    whenClause.right().accept(this, context)
+            ));
+        }
+        Expr elseExpr = null;
+        Optional<Expression> defaultValue = caseWhen.getDefaultValue();

Review Comment:
   nit: Optional is unnecessary



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


[GitHub] [doris] 924060929 commented on a diff in pull request #10947: [enhancement](nereids) support case when for TPC-H

Posted by GitBox <gi...@apache.org>.
924060929 commented on code in PR #10947:
URL: https://github.com/apache/doris/pull/10947#discussion_r926227078


##########
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/CaseWhen.java:
##########
@@ -0,0 +1,129 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.expressions;
+
+import org.apache.doris.nereids.exceptions.UnboundException;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.DataType;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * The internal representation of
+ * CASE [expr] WHEN expr THEN expr [WHEN expr THEN expr ...] [ELSE expr] END
+ * Each When/Then is stored as two consecutive children (whenExpr, thenExpr).
+ * If a case expr is given, convert it to equalTo(caseExpr, whenExpr) and set it to whenExpr.
+ * If an else expr is given then it is the last child.
+ */
+public class CaseWhen extends Expression {
+    /**
+     * If default value exists, then defaultValueIndex is the index of the last element in children,
+     * otherwise it is -1
+     */
+    private final int defaultValueIndex;

Review Comment:
   utilize index to get different part of children is ugly, we should refactor to remove children from AbstractTreeNode and provide children by concrete child class later



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


[GitHub] [doris] 924060929 merged pull request #10947: [enhancement](nereids) support case when for TPC-H

Posted by GitBox <gi...@apache.org>.
924060929 merged PR #10947:
URL: https://github.com/apache/doris/pull/10947


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org