gianm commented on code in PR #14976:
URL: https://github.com/apache/druid/pull/14976#discussion_r1326114443


##########
processing/src/main/java/org/apache/druid/math/expr/Function.java:
##########
@@ -2224,6 +2224,89 @@ public <T> ExprVectorProcessor<T> 
asVectorProcessor(Expr.VectorInputBindingInspe
     }
   }
 
+  /**
+   * SQL function "x IS NOT DISTINCT FROM y". Very similar to "x = y", i.e. 
{@link BinEqExpr}, except this function
+   * never returns null, and this function considers NULL itself to be 
not-distinct-from NULL.
+   */
+  class IsNotDistinctFromFunc implements Function
+  {
+    @Override
+    public String name()
+    {
+      return "notdistinctfrom";
+    }
+
+    @Override
+    public ExprEval apply(List<Expr> args, Expr.ObjectBinding bindings)
+    {
+      final ExprEval leftVal = args.get(0).eval(bindings);
+      final ExprEval rightVal = args.get(1).eval(bindings);
+
+      if (leftVal.value() == null || rightVal.value() == null) {
+        return ExprEval.ofLongBoolean(leftVal.value() == null && 
rightVal.value() == null);
+      }
+
+      final ExpressionType comparisonType = 
ExpressionTypeConversion.autoDetect(leftVal, rightVal);
+      switch (comparisonType.getType()) {
+        case STRING:
+          return ExprEval.ofLongBoolean(Objects.equals(leftVal.asString(), 
rightVal.asString()));
+        case LONG:
+          return ExprEval.ofLongBoolean(leftVal.asLong() == rightVal.asLong());
+        case DOUBLE:
+        default:
+          if (leftVal.isNumericNull() || rightVal.isNumericNull()) {
+            return ExprEval.ofLongBoolean(leftVal.isNumericNull() && 
rightVal.isNumericNull());

Review Comment:
   I thought this part was weird too, but didn't change it (just copied and 
adapted the code for `==`). I added this comment to make it clear where the 
code comes from:
   
   ```
         // Code copied and adapted from BinaryBooleanOpExprBase and BinEqExpr.
         // The code isn't shared due to differences in code structure: 
BinaryBooleanOpExprBase + BinEqExpr have logic
         // interleaved between parent and child class, but we can't use 
BinaryBooleanOpExprBase as a parent here, because
         // (a) this is a function, not an expr; and (b) our logic for handling 
and returning nulls is different from most
         // binary exprs, where null in means null out.
   ```



-- 
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: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to