From 66e637c9255a53593e7d49ef3cc8e7b260a427d7 Mon Sep 17 00:00:00 2001 From: Vlad Ilyushchenko Date: Tue, 19 Apr 2016 20:00:40 +0100 Subject: [PATCH] null in where clause can be used instead of NaN --- .../com/nfsdb/ql/ops/FunctionFactories.java | 29 +++++++++++++- .../nfsdb/ql/parser/VirtualColumnBuilder.java | 39 +++++++++---------- .../com/nfsdb/ql/parser/JoinQueryTest.java | 13 +++++++ 3 files changed, 59 insertions(+), 22 deletions(-) diff --git a/core/src/main/java/com/nfsdb/ql/ops/FunctionFactories.java b/core/src/main/java/com/nfsdb/ql/ops/FunctionFactories.java index d9e492bfb..a95115100 100644 --- a/core/src/main/java/com/nfsdb/ql/ops/FunctionFactories.java +++ b/core/src/main/java/com/nfsdb/ql/ops/FunctionFactories.java @@ -137,10 +137,35 @@ public final class FunctionFactories { break; case STRING: if (vc.getFlyweightStr(null) == null) { + ColumnType t = sig.paramTypes.getQuick(0); if (Chars.equals(sig.name, '=')) { - return StrEqualsNullOperator.FACTORY; + switch (t) { + case DOUBLE: + return DoubleEqualsNanOperator.FACTORY; + case STRING: + return StrEqualsNullOperator.FACTORY; + case INT: + return IntEqualsNaNOperator.FACTORY; + case LONG: + case DATE: + return LongEqualsNaNOperator.FACTORY; + default: + break; + } } else if (Chars.equals(sig.name, "!=")) { - return StrNotEqualsNullOperator.FACTORY; + switch (t) { + case DOUBLE: + return DoubleNotEqualsNanOperator.FACTORY; + case STRING: + return StrNotEqualsNullOperator.FACTORY; + case INT: + return IntNotEqualsNaNOperator.FACTORY; + case LONG: + case DATE: + return LongNotEqualsNaNOperator.FACTORY; + default: + break; + } } } break; diff --git a/core/src/main/java/com/nfsdb/ql/parser/VirtualColumnBuilder.java b/core/src/main/java/com/nfsdb/ql/parser/VirtualColumnBuilder.java index f9e294ba5..d05a3212f 100644 --- a/core/src/main/java/com/nfsdb/ql/parser/VirtualColumnBuilder.java +++ b/core/src/main/java/com/nfsdb/ql/parser/VirtualColumnBuilder.java @@ -1,24 +1,24 @@ /******************************************************************************* - * ___ _ ____ ____ - * / _ \ _ _ ___ ___| |_| _ \| __ ) - * | | | | | | |/ _ \/ __| __| | | | _ \ - * | |_| | |_| | __/\__ \ |_| |_| | |_) | - * \__\_\\__,_|\___||___/\__|____/|____/ - * + * ___ _ ____ ____ + * / _ \ _ _ ___ ___| |_| _ \| __ ) + * | | | | | | |/ _ \/ __| __| | | | _ \ + * | |_| | |_| | __/\__ \ |_| |_| | |_) | + * \__\_\\__,_|\___||___/\__|____/|____/ + *

* Copyright (C) 2014-2016 Appsicle - * + *

* This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. - * + *

* This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. - * + *

* You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . - * + *

* As a special exception, the copyright holders give permission to link the * code of portions of this program with the OpenSSL library under certain * conditions as described in each individual source file and distribute @@ -30,7 +30,6 @@ * delete this exception statement from your version. If you delete this * exception statement from all source files in the program, then also delete * it in the license file. - * ******************************************************************************/ package com.nfsdb.ql.parser; @@ -64,18 +63,10 @@ class VirtualColumnBuilder implements PostOrderTreeTraversalAlgo.Visitor { private CharSequenceIntHashMap columnNameHistogram; private CharSequenceObjHashMap parameterMap; - public VirtualColumnBuilder(PostOrderTreeTraversalAlgo algo) { + VirtualColumnBuilder(PostOrderTreeTraversalAlgo algo) { this.algo = algo; } - public VirtualColumn createVirtualColumn(QueryModel model, ExprNode node, RecordMetadata metadata) throws ParserException { - this.columnNameHistogram = model.getColumnNameHistogram(); - this.parameterMap = model.getParameterMap(); - this.metadata = metadata; - algo.traverse(node, this); - return stack.poll(); - } - @Override public void visit(ExprNode node) throws ParserException { int argCount = node.paramCount; @@ -115,6 +106,14 @@ class VirtualColumnBuilder implements PostOrderTreeTraversalAlgo.Visitor { } } + VirtualColumn createVirtualColumn(QueryModel model, ExprNode node, RecordMetadata metadata) throws ParserException { + this.columnNameHistogram = model.getColumnNameHistogram(); + this.parameterMap = model.getParameterMap(); + this.metadata = metadata; + algo.traverse(node, this); + return stack.poll(); + } + @SuppressFBWarnings({"LEST_LOST_EXCEPTION_STACK_TRACE"}) private VirtualColumn lookupColumn(ExprNode node) throws ParserException { try { diff --git a/core/src/test/java/com/nfsdb/ql/parser/JoinQueryTest.java b/core/src/test/java/com/nfsdb/ql/parser/JoinQueryTest.java index 91972c410..4c3822f1e 100644 --- a/core/src/test/java/com/nfsdb/ql/parser/JoinQueryTest.java +++ b/core/src/test/java/com/nfsdb/ql/parser/JoinQueryTest.java @@ -843,6 +843,19 @@ public class JoinQueryTest extends AbstractOptimiserTest { " limit 10,15"); } + @Test + public void testNullInsteadOfNaN() throws Exception { + assertThat("1406\tVQHYIIQL\tKJE\tnull\tDYQFLMPNGEJKKJCRCKNPUTHTVNYXM\tDFDISBFBRCCQDV\tXTGNJ\t2015-07-10T00:00:01.406Z\tNaN\tNaN\tNaN\t\t\tnull\n" + + "1414\tDHMTF\tRTGV\tnull\tHMDJSBGPXQTKPGGWFSTJSKSZSBEPDVNMFEVEMQCOHDBK\tJKBVDSERXZ\tOEENNEBQQEMXD\t2015-07-10T00:00:01.414Z\tNaN\tNaN\tNaN\t\t\tnull\n" + + "1422\tEKVFCZGGCKCHK\tEEGCRISJP\tnull\tILWBREVXDHHWPREIFCMLRXSWMFWEKIOTXUPRNGEPIJVNKTXHNKYITYG\tYYBJER\tCNSFFLTRY\t2015-07-10T00:00:01.422Z\tNaN\tNaN\tNaN\t\t\tnull\n" + + "1523\tV\tODSBTX\tnull\tECUZSRJCTRJLH\tVBNHX\tZHEI\t2015-07-10T00:00:01.523Z\tNaN\tNaN\tNaN\t\t\tnull\n" + + "1567\tBWPEIFNITZK\tBIJXCYTOHOQT\tnull\tYZMMSEZIPCOCZZUFYIVELTS\tFVPDDGSEK\tUN\t2015-07-10T00:00:01.567Z\tNaN\tNaN\tNaN\t\t\tnull\n", + "customers c" + + " outer join orders o on c.customerId = o.customerId " + + " where orderId = null" + + " limit 10,15"); + } + @Test public void testNullSymbol() throws Exception { assertThat("", -- GitLab