You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by xi...@apache.org on 2018/06/04 18:17:09 UTC

asterixdb git commit: [ASTERIXDB-2375][RT] Evaluate constant experession in SELECT only once

Repository: asterixdb
Updated Branches:
  refs/heads/master 3b0e42c23 -> 6cbc7f033


[ASTERIXDB-2375][RT] Evaluate constant experession in SELECT only once

- user model changes: none
- storage format changes: none
- interface changes: new method added to ComparisonHelper to handle
cached value.

Currently, in datascan case, the constant value is evaluated on per
tuple bases. We could cache the value to avoid the deserialization of
the constant value each time.

Change-Id: Iae4e78928da2bd63b2984b3624b88baed9b7cd73
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2621
Sonar-Qube: Jenkins <je...@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <je...@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
Reviewed-by: Dmitry Lychagin <dm...@couchbase.com>


Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/6cbc7f03
Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/6cbc7f03
Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/6cbc7f03

Branch: refs/heads/master
Commit: 6cbc7f0333dcbf546a940a0d8175e3d4ac1485a1
Parents: 3b0e42c
Author: Xikui Wang <xk...@gmail.com>
Authored: Fri Jun 1 18:12:17 2018 -0700
Committer: Xikui Wang <xk...@gmail.com>
Committed: Mon Jun 4 11:16:53 2018 -0700

----------------------------------------------------------------------
 .../org/apache/asterix/runtime/ExceptionIT.java |   4 +-
 .../secondary_idx_lookup.1.ddl.sqlpp            |  37 +++
 .../secondary_idx_lookup.2.query.sqlpp          |  22 ++
 .../secondary_idx_lookup.3.query.sqlpp          |  22 ++
 .../secondary_idx_lookup.4.query.sqlpp          |  22 ++
 .../secondary_idx_lookup.5.query.sqlpp          |  21 ++
 .../secondary_idx_lookup.6.update.sqlpp         |  20 ++
 .../secondary_idx_lookup.1.adm                  |   1 +
 .../secondary_idx_lookup.2.adm                  |   5 +
 .../secondary_idx_lookup.3.adm                  |   1 +
 .../secondary_idx_lookup.4.adm                  |   5 +
 .../resources/runtimets/testsuite_sqlpp.xml     |   5 +
 .../AbstractComparisonEvaluator.java            |  28 ++-
 .../comparisons/AbstractIfEqualsEvaluator.java  |   8 +-
 .../AbstractValueComparisonEvaluator.java       |  10 +-
 .../comparisons/ComparisonHelper.java           | 248 +++++++++++--------
 .../comparisons/EqualsDescriptor.java           |   3 +-
 .../comparisons/GreaterThanDescriptor.java      |   3 +-
 .../GreaterThanOrEqualsDescriptor.java          |   3 +-
 .../comparisons/LessThanDescriptor.java         |   3 +-
 .../comparisons/LessThanOrEqualsDescriptor.java |   3 +-
 .../comparisons/MissingIfEqualsDescriptor.java  |   3 +-
 .../comparisons/NanIfEqualsDescriptor.java      |   3 +-
 .../comparisons/NegInfIfEqualsDescriptor.java   |   3 +-
 .../comparisons/NotEqualsDescriptor.java        |   3 +-
 .../comparisons/NullIfEqualsDescriptor.java     |   3 +-
 .../comparisons/PosInfIfEqualsDescriptor.java   |   3 +-
 .../runtime/evaluators/ConstantEvalFactory.java |   4 +
 28 files changed, 350 insertions(+), 146 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java
index baaf546..ccbf4e3 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java
@@ -67,9 +67,9 @@ public class ExceptionIT {
         while (argEvalFactoryIterator.hasNext()) {
             IScalarEvaluatorFactory evalFactory = funcDesc.createEvaluatorFactory(argEvalFactoryIterator.next());
             IHyracksTaskContext ctx = mock(IHyracksTaskContext.class);
-            IScalarEvaluator evaluator = evalFactory.createScalarEvaluator(ctx);
-            IPointable resultPointable = new VoidPointable();
             try {
+                IScalarEvaluator evaluator = evalFactory.createScalarEvaluator(ctx);
+                IPointable resultPointable = new VoidPointable();
                 evaluator.evaluate(null, resultPointable);
             } catch (Throwable e) {
                 String msg = e.getMessage();

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.1.ddl.sqlpp
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.1.ddl.sqlpp
new file mode 100644
index 0000000..9083866
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.1.ddl.sqlpp
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+drop  dataverse tpch if exists;
+create  dataverse tpch;
+
+use tpch;
+
+create type tpch.SupplierType as closed {
+  s_suppkey : int32,
+  s_name : string,
+  s_address : string,
+  s_nationkey : int32,
+  s_phone : string,
+  s_acctbal : float,
+  s_comment : string
+};
+
+create  dataset Supplier(SupplierType) primary key s_name;
+
+
+load  dataset Supplier using localfs ((`path`=`asterix_nc1://data/tpch0.001/supplier.tbl`),(`format`=`delimited-text`),(`delimiter`=`|`));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.2.query.sqlpp
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.2.query.sqlpp
new file mode 100644
index 0000000..128f64f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.2.query.sqlpp
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+use tpch;
+
+select value s from Supplier s where 1 = s.s_suppkey;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.3.query.sqlpp
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.3.query.sqlpp
new file mode 100644
index 0000000..f7ed2d7
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.3.query.sqlpp
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+use tpch;
+
+select value s from Supplier s where s.s_suppkey <= 5 order by s_suppkey;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.4.query.sqlpp
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.4.query.sqlpp
new file mode 100644
index 0000000..8d10856
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.4.query.sqlpp
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+use tpch;
+
+select value s from Supplier s where s.s_nationkey = 11;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.5.query.sqlpp
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.5.query.sqlpp
new file mode 100644
index 0000000..6412265
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.5.query.sqlpp
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+use tpch;
+
+select value s from Supplier s where s.s_acctbal < 4500 order by s_suppkey;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.6.update.sqlpp
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.6.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.6.update.sqlpp
new file mode 100644
index 0000000..21d5a43
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/secondary_idx_lookup/secondary_idx_lookup.6.update.sqlpp
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+drop dataverse tpch;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/secondary_idx_lookup/secondary_idx_lookup.1.adm
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/secondary_idx_lookup/secondary_idx_lookup.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/secondary_idx_lookup/secondary_idx_lookup.1.adm
new file mode 100644
index 0000000..519d3ab
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/secondary_idx_lookup/secondary_idx_lookup.1.adm
@@ -0,0 +1 @@
+{ "s_suppkey": 1, "s_name": "Supplier#000000001", "s_address": " N kD4on9OM Ipw3,gf0JBoQDd7tgrzrddZ", "s_nationkey": 17, "s_phone": "27-918-335-1736", "s_acctbal": 5755.94, "s_comment": "each slyly above the careful" }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/secondary_idx_lookup/secondary_idx_lookup.2.adm
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/secondary_idx_lookup/secondary_idx_lookup.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/secondary_idx_lookup/secondary_idx_lookup.2.adm
new file mode 100644
index 0000000..dda08f9
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/secondary_idx_lookup/secondary_idx_lookup.2.adm
@@ -0,0 +1,5 @@
+{ "s_suppkey": 1, "s_name": "Supplier#000000001", "s_address": " N kD4on9OM Ipw3,gf0JBoQDd7tgrzrddZ", "s_nationkey": 17, "s_phone": "27-918-335-1736", "s_acctbal": 5755.94, "s_comment": "each slyly above the careful" }
+{ "s_suppkey": 2, "s_name": "Supplier#000000002", "s_address": "89eJ5ksX3ImxJQBvxObC,", "s_nationkey": 5, "s_phone": "15-679-861-2259", "s_acctbal": 4032.68, "s_comment": " slyly bold instructions. idle dependen" }
+{ "s_suppkey": 3, "s_name": "Supplier#000000003", "s_address": "q1,G3Pj6OjIuUYfUoH18BFTKP5aU9bEV3", "s_nationkey": 1, "s_phone": "11-383-516-1199", "s_acctbal": 4192.4, "s_comment": "blithely silent requests after the express dependencies are sl" }
+{ "s_suppkey": 4, "s_name": "Supplier#000000004", "s_address": "Bk7ah4CK8SYQTepEmvMkkgMwg", "s_nationkey": 15, "s_phone": "25-843-787-7479", "s_acctbal": 4641.08, "s_comment": "riously even requests above the exp" }
+{ "s_suppkey": 5, "s_name": "Supplier#000000005", "s_address": "Gcdm2rJRzl5qlTVzc", "s_nationkey": 11, "s_phone": "21-151-690-3663", "s_acctbal": -283.84, "s_comment": ". slyly regular pinto bea" }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/secondary_idx_lookup/secondary_idx_lookup.3.adm
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/secondary_idx_lookup/secondary_idx_lookup.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/secondary_idx_lookup/secondary_idx_lookup.3.adm
new file mode 100644
index 0000000..69756c0
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/secondary_idx_lookup/secondary_idx_lookup.3.adm
@@ -0,0 +1 @@
+{ "s_suppkey": 5, "s_name": "Supplier#000000005", "s_address": "Gcdm2rJRzl5qlTVzc", "s_nationkey": 11, "s_phone": "21-151-690-3663", "s_acctbal": -283.84, "s_comment": ". slyly regular pinto bea" }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/secondary_idx_lookup/secondary_idx_lookup.4.adm
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/secondary_idx_lookup/secondary_idx_lookup.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/secondary_idx_lookup/secondary_idx_lookup.4.adm
new file mode 100644
index 0000000..49ed112
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/secondary_idx_lookup/secondary_idx_lookup.4.adm
@@ -0,0 +1,5 @@
+{ "s_suppkey": 2, "s_name": "Supplier#000000002", "s_address": "89eJ5ksX3ImxJQBvxObC,", "s_nationkey": 5, "s_phone": "15-679-861-2259", "s_acctbal": 4032.68, "s_comment": " slyly bold instructions. idle dependen" }
+{ "s_suppkey": 3, "s_name": "Supplier#000000003", "s_address": "q1,G3Pj6OjIuUYfUoH18BFTKP5aU9bEV3", "s_nationkey": 1, "s_phone": "11-383-516-1199", "s_acctbal": 4192.4, "s_comment": "blithely silent requests after the express dependencies are sl" }
+{ "s_suppkey": 5, "s_name": "Supplier#000000005", "s_address": "Gcdm2rJRzl5qlTVzc", "s_nationkey": 11, "s_phone": "21-151-690-3663", "s_acctbal": -283.84, "s_comment": ". slyly regular pinto bea" }
+{ "s_suppkey": 6, "s_name": "Supplier#000000006", "s_address": "tQxuVm7s7CnK", "s_nationkey": 14, "s_phone": "24-696-997-4969", "s_acctbal": 1365.79, "s_comment": "final accounts. regular dolphins use against the furiously ironic decoys. " }
+{ "s_suppkey": 10, "s_name": "Supplier#000000010", "s_address": "Saygah3gYWMp72i PY", "s_nationkey": 24, "s_phone": "34-852-489-8585", "s_acctbal": 3891.91, "s_comment": "ing waters. regular requests ar" }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index 013fb77..50c2dcc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -1006,6 +1006,11 @@
   </test-group>
   <test-group name="comparison">
     <test-case FilePath="comparison">
+      <compilation-unit name="secondary_idx_lookup">
+        <output-dir compare="Text">secondary_idx_lookup</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="comparison">
       <compilation-unit name="year_month_duration_order">
         <output-dir compare="Text">year_month_duration_order</output-dir>
       </compilation-unit>

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java
index 4a29e01..8194c99 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java
@@ -24,6 +24,9 @@ import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.algebricks.runtime.evaluators.ConstantEvalFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.SourceLocation;
 import org.apache.hyracks.data.std.api.IPointable;
@@ -46,13 +49,25 @@ public abstract class AbstractComparisonEvaluator implements IScalarEvaluator {
     protected final IScalarEvaluator evalRight;
     protected final SourceLocation sourceLoc;
     private final ComparisonHelper ch;
+    private Number leftValue;
+    private Number rightValue;
 
-    public AbstractComparisonEvaluator(IScalarEvaluator evalLeft, IScalarEvaluator evalRight,
-            SourceLocation sourceLoc) {
-        this.evalLeft = evalLeft;
-        this.evalRight = evalRight;
+    public AbstractComparisonEvaluator(IScalarEvaluatorFactory evalLeftFactory,
+            IScalarEvaluatorFactory evalRightFactory, IHyracksTaskContext ctx, SourceLocation sourceLoc)
+            throws HyracksDataException {
+        this.evalLeft = evalLeftFactory.createScalarEvaluator(ctx);
+        this.evalRight = evalRightFactory.createScalarEvaluator(ctx);
         this.sourceLoc = sourceLoc;
         ch = new ComparisonHelper(sourceLoc);
+        leftValue = getValueOfConstantEval(evalLeftFactory);
+        rightValue = getValueOfConstantEval(evalRightFactory);
+    }
+
+    private Number getValueOfConstantEval(IScalarEvaluatorFactory factory) throws HyracksDataException {
+        if (factory instanceof ConstantEvalFactory) {
+            return ch.getNumberValue(((ConstantEvalFactory) factory).getValue());
+        }
+        return null;
     }
 
     @Override
@@ -79,7 +94,8 @@ public abstract class AbstractComparisonEvaluator implements IScalarEvaluator {
     }
 
     int compare() throws HyracksDataException {
-        return ch.compare(EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argLeft.getTag()),
-                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argRight.getTag()), outLeft, outRight);
+        ATypeTag leftTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argLeft.getTag());
+        ATypeTag rightTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argRight.getTag());
+        return ch.compare(leftTypeTag, rightTypeTag, outLeft, outRight, leftValue, rightValue);
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractIfEqualsEvaluator.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractIfEqualsEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractIfEqualsEvaluator.java
index e157c0a..27ae471 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractIfEqualsEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractIfEqualsEvaluator.java
@@ -19,15 +19,17 @@
 
 package org.apache.asterix.runtime.evaluators.comparisons;
 
-import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.SourceLocation;
 import org.apache.hyracks.data.std.api.IPointable;
 
 public abstract class AbstractIfEqualsEvaluator extends AbstractComparisonEvaluator {
 
-    AbstractIfEqualsEvaluator(IScalarEvaluator evalLeft, IScalarEvaluator evalRight, SourceLocation sourceLoc) {
-        super(evalLeft, evalRight, sourceLoc);
+    AbstractIfEqualsEvaluator(IScalarEvaluatorFactory evalLeftFactory, IScalarEvaluatorFactory evalRightFactory,
+            IHyracksTaskContext ctx, SourceLocation sourceLoc) throws HyracksDataException {
+        super(evalLeftFactory, evalRightFactory, ctx, sourceLoc);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractValueComparisonEvaluator.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractValueComparisonEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractValueComparisonEvaluator.java
index 14b35f0..2d8c499 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractValueComparisonEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractValueComparisonEvaluator.java
@@ -26,7 +26,8 @@ import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.runtime.exceptions.UnsupportedTypeException;
-import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.SourceLocation;
@@ -40,9 +41,10 @@ public abstract class AbstractValueComparisonEvaluator extends AbstractCompariso
     protected ISerializerDeserializer<ANull> nullSerde =
             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL);
 
-    public AbstractValueComparisonEvaluator(IScalarEvaluator evalLeft, IScalarEvaluator evalRight,
-            SourceLocation sourceLoc) {
-        super(evalLeft, evalRight, sourceLoc);
+    public AbstractValueComparisonEvaluator(IScalarEvaluatorFactory evalLeftFactory,
+            IScalarEvaluatorFactory evalRightFactory, IHyracksTaskContext ctx, SourceLocation sourceLoc)
+            throws HyracksDataException {
+        super(evalLeftFactory, evalRightFactory, ctx, sourceLoc);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/ComparisonHelper.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/ComparisonHelper.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/ComparisonHelper.java
index a0b5677..2f82173 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/ComparisonHelper.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/ComparisonHelper.java
@@ -37,16 +37,18 @@ import org.apache.asterix.dataflow.data.nontagged.serde.AInt64SerializerDeserial
 import org.apache.asterix.dataflow.data.nontagged.serde.AInt8SerializerDeserializer;
 import org.apache.asterix.formats.nontagged.BinaryComparatorFactoryProvider;
 import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.runtime.exceptions.IncompatibleTypeException;
 import org.apache.asterix.runtime.exceptions.UnsupportedTypeException;
 import org.apache.hyracks.api.dataflow.value.IBinaryComparator;
+import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.SourceLocation;
 import org.apache.hyracks.data.std.accessors.PointableBinaryComparatorFactory;
 import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.primitive.ByteArrayPointable;
-import org.apache.hyracks.data.std.primitive.FloatPointable;
-import org.apache.hyracks.data.std.primitive.IntegerPointable;
+
+import static org.apache.asterix.om.types.ATypeTag.TINYINT;
 
 public class ComparisonHelper implements Serializable {
     private static final long serialVersionUID = 1L;
@@ -81,21 +83,21 @@ public class ComparisonHelper implements Serializable {
         this.sourceLoc = sourceLoc;
     }
 
-    public int compare(ATypeTag typeTag1, ATypeTag typeTag2, IPointable arg1, IPointable arg2)
+    public int compare(ATypeTag typeTag1, ATypeTag typeTag2, IPointable arg1, IPointable arg2, Number obj1, Number obj2)
             throws HyracksDataException {
         switch (typeTag1) {
             case TINYINT:
-                return compareInt8WithArg(typeTag2, arg1, arg2);
+                return compareInt8WithArg(typeTag2, arg1, arg2, obj1, obj2);
             case SMALLINT:
-                return compareInt16WithArg(typeTag2, arg1, arg2);
+                return compareInt16WithArg(typeTag2, arg1, arg2, obj1, obj2);
             case INTEGER:
-                return compareInt32WithArg(typeTag2, arg1, arg2);
+                return compareInt32WithArg(typeTag2, arg1, arg2, obj1, obj2);
             case BIGINT:
-                return compareInt64WithArg(typeTag2, arg1, arg2);
+                return compareInt64WithArg(typeTag2, arg1, arg2, obj1, obj2);
             case FLOAT:
-                return compareFloatWithArg(typeTag2, arg1, arg2);
+                return compareFloatWithArg(typeTag2, arg1, arg2, obj1, obj2);
             case DOUBLE:
-                return compareDoubleWithArg(typeTag2, arg1, arg2);
+                return compareDoubleWithArg(typeTag2, arg1, arg2, obj1, obj2);
             case STRING:
                 return compareStringWithArg(typeTag2, arg1, arg2);
             case BOOLEAN:
@@ -105,6 +107,11 @@ public class ComparisonHelper implements Serializable {
         }
     }
 
+    public int compare(ATypeTag typeTag1, ATypeTag typeTag2, IPointable arg1, IPointable arg2)
+            throws HyracksDataException {
+        return compare(typeTag1, typeTag2, arg1, arg2, null, null);
+    }
+
     private int compareStrongTypedWithArg(ATypeTag expectedTypeTag, ATypeTag actualTypeTag, IPointable arg1,
             IPointable arg2) throws HyracksDataException {
         if (expectedTypeTag != actualTypeTag) {
@@ -192,26 +199,27 @@ public class ComparisonHelper implements Serializable {
                 typeTag2.serialize());
     }
 
-    private int compareDoubleWithArg(ATypeTag typeTag2, IPointable arg1, IPointable arg2) throws HyracksDataException {
+    private int compareDoubleWithArg(ATypeTag typeTag2, IPointable arg1, IPointable arg2, Number obj1, Number obj2)
+            throws HyracksDataException {
         byte[] leftBytes = arg1.getByteArray();
         int leftOffset = arg1.getStartOffset();
         byte[] rightBytes = arg2.getByteArray();
         int rightOffset = arg2.getStartOffset();
 
-        double s = ADoubleSerializerDeserializer.getDouble(leftBytes, leftOffset);
+        double s = getOrDeserializeDouble(leftBytes, leftOffset, obj1);
         switch (typeTag2) {
             case TINYINT:
-                return compareDouble(s, AInt8SerializerDeserializer.getByte(rightBytes, rightOffset));
+                return compareDouble(s, getOrDeserializeTinyInt(rightBytes, rightOffset, obj2));
             case SMALLINT:
-                return compareDouble(s, AInt16SerializerDeserializer.getShort(rightBytes, rightOffset));
+                return compareDouble(s, getOrDeserializeSmallInt(rightBytes, rightOffset, obj2));
             case INTEGER:
-                return compareDouble(s, AInt32SerializerDeserializer.getInt(rightBytes, rightOffset));
+                return compareDouble(s, getOrDeserializeInt(rightBytes, rightOffset, obj2));
             case BIGINT:
-                return compareDouble(s, AInt64SerializerDeserializer.getLong(rightBytes, rightOffset));
+                return compareDouble(s, getOrDeserializeBigInt(rightBytes, rightOffset, obj2));
             case FLOAT:
-                return compareDouble(s, AFloatSerializerDeserializer.getFloat(rightBytes, rightOffset));
+                return compareDouble(s, getOrDeserializeFloat(rightBytes, rightOffset, obj2));
             case DOUBLE:
-                return compareDouble(s, ADoubleSerializerDeserializer.getDouble(rightBytes, rightOffset));
+                return compareDouble(s, getOrDeserializeDouble(rightBytes, rightOffset, obj2));
             default: {
                 throw new IncompatibleTypeException(sourceLoc, COMPARISON, ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG,
                         typeTag2.serialize());
@@ -219,161 +227,165 @@ public class ComparisonHelper implements Serializable {
         }
     }
 
-    private int compareFloatWithArg(ATypeTag typeTag2, IPointable arg1, IPointable arg2) throws HyracksDataException {
+    private int compareFloatWithArg(ATypeTag typeTag2, IPointable arg1, IPointable arg2, Number obj1, Number obj2)
+            throws HyracksDataException {
         byte[] leftBytes = arg1.getByteArray();
         int leftOffset = arg1.getStartOffset();
         byte[] rightBytes = arg2.getByteArray();
         int rightOffset = arg2.getStartOffset();
 
-        float s = FloatPointable.getFloat(leftBytes, leftOffset);
+        float s = getOrDeserializeFloat(leftBytes, leftOffset, obj1);
         switch (typeTag2) {
             case TINYINT:
-                return compareFloat(s, AInt8SerializerDeserializer.getByte(rightBytes, rightOffset));
+                return compareFloat(s, getOrDeserializeTinyInt(rightBytes, rightOffset, obj2));
             case SMALLINT:
-                return compareFloat(s, AInt16SerializerDeserializer.getShort(rightBytes, rightOffset));
+                return compareFloat(s, getOrDeserializeSmallInt(rightBytes, rightOffset, obj2));
             case INTEGER:
-                return compareFloat(s, AInt32SerializerDeserializer.getInt(rightBytes, rightOffset));
+                return compareFloat(s, getOrDeserializeInt(rightBytes, rightOffset, obj2));
             case BIGINT:
-                return compareFloat(s, AInt64SerializerDeserializer.getLong(rightBytes, rightOffset));
+                return compareFloat(s, getOrDeserializeBigInt(rightBytes, rightOffset, obj2));
             case FLOAT:
-                return compareFloat(s, AFloatSerializerDeserializer.getFloat(rightBytes, rightOffset));
+                return compareFloat(s, getOrDeserializeFloat(rightBytes, rightOffset, obj2));
             case DOUBLE:
-                return compareDouble(s, ADoubleSerializerDeserializer.getDouble(rightBytes, rightOffset));
+                return compareDouble(s, getOrDeserializeDouble(rightBytes, rightOffset, obj2));
             default:
                 throw new IncompatibleTypeException(sourceLoc, COMPARISON, ATypeTag.SERIALIZED_FLOAT_TYPE_TAG,
                         typeTag2.serialize());
         }
     }
 
-    private int compareInt64WithArg(ATypeTag typeTag2, IPointable arg1, IPointable arg2) throws HyracksDataException {
+    private int compareInt64WithArg(ATypeTag typeTag2, IPointable arg1, IPointable arg2, Number obj1, Number obj2)
+            throws HyracksDataException {
         byte[] leftBytes = arg1.getByteArray();
         int leftOffset = arg1.getStartOffset();
         byte[] rightBytes = arg2.getByteArray();
         int rightOffset = arg2.getStartOffset();
 
-        long s = AInt64SerializerDeserializer.getLong(leftBytes, leftOffset);
+        long s = getOrDeserializeBigInt(leftBytes, leftOffset, obj1);
         switch (typeTag2) {
             case TINYINT:
-                return compareLong(s, AInt8SerializerDeserializer.getByte(rightBytes, rightOffset));
+                return compareLong(s, getOrDeserializeTinyInt(rightBytes, rightOffset, obj2));
             case SMALLINT:
-                return compareLong(s, AInt16SerializerDeserializer.getShort(rightBytes, rightOffset));
+                return compareLong(s, getOrDeserializeSmallInt(rightBytes, rightOffset, obj2));
             case INTEGER:
-                return compareLong(s, AInt32SerializerDeserializer.getInt(rightBytes, rightOffset));
+                return compareLong(s, getOrDeserializeInt(rightBytes, rightOffset, obj2));
             case BIGINT:
-                return compareLong(s, AInt64SerializerDeserializer.getLong(rightBytes, rightOffset));
+                return compareLong(s, getOrDeserializeBigInt(rightBytes, rightOffset, obj2));
             case FLOAT:
-                return compareFloat(s, AFloatSerializerDeserializer.getFloat(rightBytes, rightOffset));
+                return compareFloat(s, getOrDeserializeFloat(rightBytes, rightOffset, obj2));
             case DOUBLE:
-                return compareDouble(s, ADoubleSerializerDeserializer.getDouble(rightBytes, rightOffset));
+                return compareDouble(s, getOrDeserializeDouble(rightBytes, rightOffset, obj2));
             default:
                 throw new IncompatibleTypeException(sourceLoc, COMPARISON, ATypeTag.SERIALIZED_INT64_TYPE_TAG,
                         typeTag2.serialize());
         }
     }
 
-    private int compareInt32WithArg(ATypeTag typeTag2, IPointable arg1, IPointable arg2) throws HyracksDataException {
+    private int compareInt32WithArg(ATypeTag typeTag2, IPointable arg1, IPointable arg2, Number obj1, Number obj2)
+            throws HyracksDataException {
         byte[] leftBytes = arg1.getByteArray();
         int leftOffset = arg1.getStartOffset();
         byte[] rightBytes = arg2.getByteArray();
         int rightOffset = arg2.getStartOffset();
 
-        int s = IntegerPointable.getInteger(leftBytes, leftOffset);
+        int s = getOrDeserializeInt(leftBytes, leftOffset, obj1);
         switch (typeTag2) {
-            case TINYINT: {
-                byte v2 = AInt8SerializerDeserializer.getByte(rightBytes, rightOffset);
-                return compareInt(s, v2);
-            }
-            case SMALLINT: {
-                short v2 = AInt16SerializerDeserializer.getShort(rightBytes, rightOffset);
-                return compareInt(s, v2);
-            }
-            case INTEGER: {
-                int v2 = AInt32SerializerDeserializer.getInt(rightBytes, rightOffset);
-                return compareInt(s, v2);
-            }
-            case BIGINT: {
-                long v2 = AInt64SerializerDeserializer.getLong(rightBytes, rightOffset);
-                return compareLong(s, v2);
-            }
-            case FLOAT: {
-                float v2 = AFloatSerializerDeserializer.getFloat(rightBytes, rightOffset);
-                return compareFloat(s, v2);
-            }
-            case DOUBLE: {
-                double v2 = ADoubleSerializerDeserializer.getDouble(rightBytes, rightOffset);
-                return compareDouble(s, v2);
-            }
+            case TINYINT:
+                return compareInt(s, getOrDeserializeTinyInt(rightBytes, rightOffset, obj2));
+            case SMALLINT:
+                return compareInt(s, getOrDeserializeSmallInt(rightBytes, rightOffset, obj2));
+            case INTEGER:
+                return compareInt(s, getOrDeserializeInt(rightBytes, rightOffset, obj2));
+            case BIGINT:
+                return compareLong(s, getOrDeserializeBigInt(rightBytes, rightOffset, obj2));
+            case FLOAT:
+                return compareFloat(s, getOrDeserializeFloat(rightBytes, rightOffset, obj2));
+            case DOUBLE:
+                return compareDouble(s, getOrDeserializeDouble(rightBytes, rightOffset, obj2));
             default:
                 throw new IncompatibleTypeException(sourceLoc, COMPARISON, ATypeTag.SERIALIZED_INT32_TYPE_TAG,
                         typeTag2.serialize());
         }
     }
 
-    private int compareInt16WithArg(ATypeTag typeTag2, IPointable arg1, IPointable arg2) throws HyracksDataException {
+    private int compareInt16WithArg(ATypeTag typeTag2, IPointable arg1, IPointable arg2, Number obj1, Number obj2)
+            throws HyracksDataException {
         byte[] leftBytes = arg1.getByteArray();
         int leftOffset = arg1.getStartOffset();
         byte[] rightBytes = arg2.getByteArray();
         int rightOffset = arg2.getStartOffset();
 
-        short s = AInt16SerializerDeserializer.getShort(leftBytes, leftOffset);
+        short s = getOrDeserializeSmallInt(leftBytes, leftOffset, obj1);
         switch (typeTag2) {
-            case TINYINT: {
-                byte v2 = AInt8SerializerDeserializer.getByte(rightBytes, rightOffset);
-                return compareShort(s, v2);
-            }
-            case SMALLINT: {
-                short v2 = AInt16SerializerDeserializer.getShort(rightBytes, rightOffset);
-                return compareShort(s, v2);
-            }
-            case INTEGER: {
-                int v2 = AInt32SerializerDeserializer.getInt(rightBytes, rightOffset);
-                return compareInt(s, v2);
-            }
-            case BIGINT: {
-                long v2 = AInt64SerializerDeserializer.getLong(rightBytes, rightOffset);
-                return compareLong(s, v2);
-            }
-            case FLOAT: {
-                float v2 = AFloatSerializerDeserializer.getFloat(rightBytes, rightOffset);
-                return compareFloat(s, v2);
-            }
-            case DOUBLE: {
-                double v2 = ADoubleSerializerDeserializer.getDouble(rightBytes, rightOffset);
-                return compareDouble(s, v2);
-            }
-            default: {
+            case TINYINT:
+                return compareShort(s, getOrDeserializeTinyInt(rightBytes, rightOffset, obj2));
+            case SMALLINT:
+                return compareShort(s, getOrDeserializeSmallInt(rightBytes, rightOffset, obj2));
+            case INTEGER:
+                return compareInt(s, getOrDeserializeInt(rightBytes, rightOffset, obj2));
+            case BIGINT:
+                return compareLong(s, getOrDeserializeBigInt(rightBytes, rightOffset, obj2));
+            case FLOAT:
+                return compareFloat(s, getOrDeserializeFloat(rightBytes, rightOffset, obj2));
+            case DOUBLE:
+                return compareDouble(s, getOrDeserializeDouble(rightBytes, rightOffset, obj2));
+            default:
                 throw new IncompatibleTypeException(sourceLoc, COMPARISON, ATypeTag.SERIALIZED_INT16_TYPE_TAG,
                         typeTag2.serialize());
-            }
         }
     }
 
-    private int compareInt8WithArg(ATypeTag typeTag2, IPointable arg1, IPointable arg2) throws HyracksDataException {
+    private int compareInt8WithArg(ATypeTag typeTag2, IPointable arg1, IPointable arg2, Number obj1, Number obj2)
+            throws HyracksDataException {
         byte[] leftBytes = arg1.getByteArray();
         int leftStart = arg1.getStartOffset();
         byte[] rightBytes = arg2.getByteArray();
         int rightStart = arg2.getStartOffset();
 
-        byte s = AInt8SerializerDeserializer.getByte(leftBytes, leftStart);
+        byte s = getOrDeserializeTinyInt(leftBytes, leftStart, obj1);
         switch (typeTag2) {
             case TINYINT:
-                return compareByte(s, AInt8SerializerDeserializer.getByte(rightBytes, rightStart));
+                return compareByte(s, getOrDeserializeTinyInt(rightBytes, rightStart, obj2));
             case SMALLINT:
-                return compareShort(s, AInt16SerializerDeserializer.getShort(rightBytes, rightStart));
+                return compareShort(s, getOrDeserializeSmallInt(rightBytes, rightStart, obj2));
             case INTEGER:
-                return compareInt(s, AInt32SerializerDeserializer.getInt(rightBytes, rightStart));
+                return compareInt(s, getOrDeserializeInt(rightBytes, rightStart, obj2));
             case BIGINT:
-                return compareLong(s, AInt64SerializerDeserializer.getLong(rightBytes, rightStart));
+                return compareLong(s, getOrDeserializeBigInt(rightBytes, rightStart, obj2));
             case FLOAT:
-                return compareFloat(s, AFloatSerializerDeserializer.getFloat(rightBytes, rightStart));
+                return compareFloat(s, getOrDeserializeFloat(rightBytes, rightStart, obj2));
             case DOUBLE:
-                return compareDouble(s, ADoubleSerializerDeserializer.getDouble(rightBytes, rightStart));
+                return compareDouble(s, getOrDeserializeDouble(rightBytes, rightStart, obj2));
             default:
                 throw new IncompatibleTypeException(sourceLoc, COMPARISON, ATypeTag.SERIALIZED_INT8_TYPE_TAG,
                         typeTag2.serialize());
         }
     }
 
+    private final byte getOrDeserializeTinyInt(byte[] bytes, int offset, Number obj) {
+        return obj == null ? AInt8SerializerDeserializer.getByte(bytes, offset) : obj.byteValue();
+    }
+
+    private final short getOrDeserializeSmallInt(byte[] bytes, int offset, Number obj) {
+        return obj == null ? AInt16SerializerDeserializer.getShort(bytes, offset) : obj.shortValue();
+    }
+
+    private final int getOrDeserializeInt(byte[] bytes, int offset, Number obj) {
+        return obj == null ? AInt32SerializerDeserializer.getInt(bytes, offset) : obj.intValue();
+    }
+
+    private final long getOrDeserializeBigInt(byte[] bytes, int offset, Number obj) {
+        return obj == null ? AInt64SerializerDeserializer.getLong(bytes, offset) : obj.longValue();
+    }
+
+    private final float getOrDeserializeFloat(byte[] bytes, int offset, Number obj) {
+        return obj == null ? AFloatSerializerDeserializer.getFloat(bytes, offset) : obj.floatValue();
+    }
+
+    private final double getOrDeserializeDouble(byte[] bytes, int offset, Number obj) {
+        return obj == null ? ADoubleSerializerDeserializer.getDouble(bytes, offset) : obj.doubleValue();
+    }
+
     private final int compareByte(int v1, int v2) {
         if (v1 == v2) {
             return 0;
@@ -415,23 +427,41 @@ public class ComparisonHelper implements Serializable {
     }
 
     private final int compareFloat(float v1, float v2) {
-        if (v1 == v2) {
-            return 0;
-        } else if (v1 < v2) {
-            return -1;
-        } else {
-            return 1;
-        }
+        return Float.compare(v1, v2);
     }
 
     private final int compareDouble(double v1, double v2) {
-        if (v1 == v2) {
-            return 0;
-        } else if (v1 < v2) {
-            return -1;
-        } else {
-            return 1;
-        }
+        return Double.compare(v1, v2);
     }
 
+    /**
+     * When field value falls into the primitive type groups, we consider to cache its value instead of deserialize it
+     * every time.
+     *
+     * @param bytes
+     * @return primitive value as Number
+     */
+    public Number getNumberValue(byte[] bytes) {
+        ATypeTag aTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[0]);
+        int offset = 1;
+        if (aTypeTag == null) {
+            return null;
+        }
+        switch (aTypeTag) {
+            case TINYINT:
+                return AInt8SerializerDeserializer.getByte(bytes, offset);
+            case SMALLINT:
+                return AInt16SerializerDeserializer.getShort(bytes, offset);
+            case INTEGER:
+                return AInt32SerializerDeserializer.getInt(bytes, offset);
+            case BIGINT:
+                return AInt64SerializerDeserializer.getLong(bytes, offset);
+            case FLOAT:
+                return AFloatSerializerDeserializer.getFloat(bytes, offset);
+            case DOUBLE:
+                return ADoubleSerializerDeserializer.getDouble(bytes, offset);
+            default:
+                return null;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/EqualsDescriptor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/EqualsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/EqualsDescriptor.java
index 80d186d..f38c3e5 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/EqualsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/EqualsDescriptor.java
@@ -50,8 +50,7 @@ public class EqualsDescriptor extends AbstractScalarFunctionDynamicDescriptor {
 
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
-                return new AbstractValueComparisonEvaluator(args[0].createScalarEvaluator(ctx),
-                        args[1].createScalarEvaluator(ctx), sourceLoc) {
+                return new AbstractValueComparisonEvaluator(args[0], args[1], ctx, sourceLoc) {
 
                     @Override
                     protected boolean getComparisonResult(int r) {

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/GreaterThanDescriptor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/GreaterThanDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/GreaterThanDescriptor.java
index d1fac52..3815666 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/GreaterThanDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/GreaterThanDescriptor.java
@@ -50,8 +50,7 @@ public class GreaterThanDescriptor extends AbstractScalarFunctionDynamicDescript
 
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
-                return new AbstractValueComparisonEvaluator(args[0].createScalarEvaluator(ctx),
-                        args[1].createScalarEvaluator(ctx), sourceLoc) {
+                return new AbstractValueComparisonEvaluator(args[0], args[1], ctx, sourceLoc) {
 
                     @Override
                     protected boolean getComparisonResult(int r) {

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/GreaterThanOrEqualsDescriptor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/GreaterThanOrEqualsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/GreaterThanOrEqualsDescriptor.java
index 6ff0d68..1598165 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/GreaterThanOrEqualsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/GreaterThanOrEqualsDescriptor.java
@@ -50,8 +50,7 @@ public class GreaterThanOrEqualsDescriptor extends AbstractScalarFunctionDynamic
 
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
-                return new AbstractValueComparisonEvaluator(args[0].createScalarEvaluator(ctx),
-                        args[1].createScalarEvaluator(ctx), sourceLoc) {
+                return new AbstractValueComparisonEvaluator(args[0], args[1], ctx, sourceLoc) {
 
                     @Override
                     protected boolean getComparisonResult(int r) {

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/LessThanDescriptor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/LessThanDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/LessThanDescriptor.java
index 77280e5..4198934 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/LessThanDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/LessThanDescriptor.java
@@ -50,8 +50,7 @@ public class LessThanDescriptor extends AbstractScalarFunctionDynamicDescriptor
 
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
-                return new AbstractValueComparisonEvaluator(args[0].createScalarEvaluator(ctx),
-                        args[1].createScalarEvaluator(ctx), sourceLoc) {
+                return new AbstractValueComparisonEvaluator(args[0], args[1], ctx, sourceLoc) {
 
                     @Override
                     protected boolean getComparisonResult(int r) {

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/LessThanOrEqualsDescriptor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/LessThanOrEqualsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/LessThanOrEqualsDescriptor.java
index 58ac40e..478c652 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/LessThanOrEqualsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/LessThanOrEqualsDescriptor.java
@@ -50,8 +50,7 @@ public class LessThanOrEqualsDescriptor extends AbstractScalarFunctionDynamicDes
 
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
-                return new AbstractValueComparisonEvaluator(args[0].createScalarEvaluator(ctx),
-                        args[1].createScalarEvaluator(ctx), sourceLoc) {
+                return new AbstractValueComparisonEvaluator(args[0], args[1], ctx, sourceLoc) {
 
                     @Override
                     protected boolean getComparisonResult(int r) {

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/MissingIfEqualsDescriptor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/MissingIfEqualsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/MissingIfEqualsDescriptor.java
index 62d9957..7ed194c 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/MissingIfEqualsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/MissingIfEqualsDescriptor.java
@@ -54,8 +54,7 @@ public class MissingIfEqualsDescriptor extends AbstractScalarFunctionDynamicDesc
 
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
-                return new AbstractIfEqualsEvaluator(args[0].createScalarEvaluator(ctx),
-                        args[1].createScalarEvaluator(ctx), sourceLoc) {
+                return new AbstractIfEqualsEvaluator(args[0], args[1], ctx, sourceLoc) {
 
                     @SuppressWarnings("unchecked")
                     final ISerializerDeserializer<AMissing> missingSerde =

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NanIfEqualsDescriptor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NanIfEqualsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NanIfEqualsDescriptor.java
index bacf9e4..af50678 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NanIfEqualsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NanIfEqualsDescriptor.java
@@ -55,8 +55,7 @@ public class NanIfEqualsDescriptor extends AbstractScalarFunctionDynamicDescript
 
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
-                return new AbstractIfEqualsEvaluator(args[0].createScalarEvaluator(ctx),
-                        args[1].createScalarEvaluator(ctx), sourceLoc) {
+                return new AbstractIfEqualsEvaluator(args[0], args[1], ctx, sourceLoc) {
 
                     final AMutableDouble equalsResult = new AMutableDouble(Double.NaN);
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NegInfIfEqualsDescriptor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NegInfIfEqualsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NegInfIfEqualsDescriptor.java
index b161ce0..a70bc7b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NegInfIfEqualsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NegInfIfEqualsDescriptor.java
@@ -55,8 +55,7 @@ public class NegInfIfEqualsDescriptor extends AbstractScalarFunctionDynamicDescr
 
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
-                return new AbstractIfEqualsEvaluator(args[0].createScalarEvaluator(ctx),
-                        args[1].createScalarEvaluator(ctx), sourceLoc) {
+                return new AbstractIfEqualsEvaluator(args[0], args[1], ctx, sourceLoc) {
 
                     final AMutableDouble equalsResult = new AMutableDouble(Double.NEGATIVE_INFINITY);
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NotEqualsDescriptor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NotEqualsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NotEqualsDescriptor.java
index b997a80..6e03ef8 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NotEqualsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NotEqualsDescriptor.java
@@ -50,8 +50,7 @@ public class NotEqualsDescriptor extends AbstractScalarFunctionDynamicDescriptor
 
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
-                return new AbstractValueComparisonEvaluator(args[0].createScalarEvaluator(ctx),
-                        args[1].createScalarEvaluator(ctx), sourceLoc) {
+                return new AbstractValueComparisonEvaluator(args[0], args[1], ctx, sourceLoc) {
 
                     @Override
                     protected boolean getComparisonResult(int r) {

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NullIfEqualsDescriptor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NullIfEqualsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NullIfEqualsDescriptor.java
index 40f262a..5df5142 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NullIfEqualsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NullIfEqualsDescriptor.java
@@ -54,8 +54,7 @@ public class NullIfEqualsDescriptor extends AbstractScalarFunctionDynamicDescrip
 
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
-                return new AbstractIfEqualsEvaluator(args[0].createScalarEvaluator(ctx),
-                        args[1].createScalarEvaluator(ctx), sourceLoc) {
+                return new AbstractIfEqualsEvaluator(args[0], args[1], ctx, sourceLoc) {
 
                     @SuppressWarnings("unchecked")
                     final ISerializerDeserializer<ANull> nullSerde =

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/PosInfIfEqualsDescriptor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/PosInfIfEqualsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/PosInfIfEqualsDescriptor.java
index b02c3e5..a1f4f13 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/PosInfIfEqualsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/PosInfIfEqualsDescriptor.java
@@ -55,8 +55,7 @@ public class PosInfIfEqualsDescriptor extends AbstractScalarFunctionDynamicDescr
 
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
-                return new AbstractIfEqualsEvaluator(args[0].createScalarEvaluator(ctx),
-                        args[1].createScalarEvaluator(ctx), sourceLoc) {
+                return new AbstractIfEqualsEvaluator(args[0], args[1], ctx, sourceLoc) {
 
                     final AMutableDouble equalsResult = new AMutableDouble(Double.POSITIVE_INFINITY);
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/6cbc7f03/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/evaluators/ConstantEvalFactory.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/evaluators/ConstantEvalFactory.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/evaluators/ConstantEvalFactory.java
index 26cc5cb..c55d0f3 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/evaluators/ConstantEvalFactory.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/evaluators/ConstantEvalFactory.java
@@ -34,6 +34,10 @@ public class ConstantEvalFactory implements IScalarEvaluatorFactory {
         this.value = value;
     }
 
+    public byte[] getValue() {
+        return value;
+    }
+
     @Override
     public String toString() {
         return "Constant";