diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/ComparisonQueries.xml b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/ComparisonQueries.xml
index 56df4ad..09845d8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/ComparisonQueries.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/ComparisonQueries.xml
@@ -175,41 +175,6 @@
     </compilation-unit>
   </test-case>
   <test-case FilePath="comparison">
-    <compilation-unit name="issue363_inequality_duration">
-      <output-dir compare="Text">issue363_inequality_duration</output-dir>
-    </compilation-unit>
-  </test-case>
-  <test-case FilePath="comparison">
-    <compilation-unit name="issue363_inequality_interval">
-      <output-dir compare="Text">issue363_inequality_interval</output-dir>
-    </compilation-unit>
-  </test-case>
-  <test-case FilePath="comparison">
-    <compilation-unit name="issue363_inequality_point">
-      <output-dir compare="Text">issue363_inequality_point</output-dir>
-    </compilation-unit>
-  </test-case>
-  <test-case FilePath="comparison">
-    <compilation-unit name="issue363_inequality_line">
-      <output-dir compare="Text">issue363_inequality_line</output-dir>
-    </compilation-unit>
-  </test-case>
-  <test-case FilePath="comparison">
-    <compilation-unit name="issue363_inequality_polygon">
-      <output-dir compare="Text">issue363_inequality_polygon</output-dir>
-    </compilation-unit>
-  </test-case>
-  <test-case FilePath="comparison">
-    <compilation-unit name="issue363_inequality_rectangle">
-      <output-dir compare="Text">issue363_inequality_rectangle</output-dir>
-    </compilation-unit>
-  </test-case>
-  <test-case FilePath="comparison">
-    <compilation-unit name="issue363_inequality_circle">
-      <output-dir compare="Text">issue363_inequality_circle</output-dir>
-    </compilation-unit>
-  </test-case>
-  <test-case FilePath="comparison">
     <compilation-unit name="binary">
       <output-dir compare="Text">binary</output-dir>
     </compilation-unit>
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_circle/issue363_inequality_circle.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_circle/issue363_inequality_circle.1.ddl.aql
deleted file mode 100644
index 2ffaa10..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_circle/issue363_inequality_circle.1.ddl.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of circle
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_circle/issue363_inequality_circle.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_circle/issue363_inequality_circle.2.update.aql
deleted file mode 100644
index 2ffaa10..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_circle/issue363_inequality_circle.2.update.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of circle
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_circle/issue363_inequality_circle.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_circle/issue363_inequality_circle.3.query.aql
deleted file mode 100644
index 9dbc490..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_circle/issue363_inequality_circle.3.query.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of circle
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
- 
-let $v1 := circle("0.1234,-1.00e-10 +10.5E-2")
-let $dv1 := circle("0.5678,-1.00e-10 +10.5E-2")
-
-return { "circle0":  $v1 > $dv1, "circle1": $dv1 < $v1, "circle2":  $v1 >= $dv1, "circle3": $dv1 <= $v1 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.2.update.aql
deleted file mode 100644
index b0a772c..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.2.update.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of duration
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.3.query.aql
deleted file mode 100644
index 1c47674..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.3.query.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of duration
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
- 
-let $v1 := duration("P300Y6M3DT9H5M2.348S")
-let $dv1 := duration("P3Y6M3DT9H5M2.348S")
-
-return { "duration0":  $v1 > $dv1, "duration1": $dv1 < $v1, "duration2":  $v1 >= $dv1, "duration3": $dv1 <= $v1 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_interval/issue363_inequality_interval.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_interval/issue363_inequality_interval.1.ddl.aql
deleted file mode 100644
index 4cc0a14..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_interval/issue363_inequality_interval.1.ddl.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of interval
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_interval/issue363_inequality_interval.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_interval/issue363_inequality_interval.2.update.aql
deleted file mode 100644
index 4cc0a14..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_interval/issue363_inequality_interval.2.update.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of interval
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_interval/issue363_inequality_interval.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_interval/issue363_inequality_interval.3.query.aql
deleted file mode 100644
index 9d1a868..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_interval/issue363_inequality_interval.3.query.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of interval
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
-
-let $v1 := interval(datetime("-1987-11-19T02:43:57.938+08:00"), datetime("19991112T124935948-0700"))
-let $dv1 := interval(datetime("-1983-11-19T02:43:57.938+08:00"), datetime("19991112T124935948-0700"))
-
-return { "interval0":  $v1 > $dv1, "interval1": $dv1 < $v1, "interval2":  $v1 >= $dv1, "interval3": $dv1 <= $v1 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_line/issue363_inequality_line.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_line/issue363_inequality_line.1.ddl.aql
deleted file mode 100644
index 104f28d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_line/issue363_inequality_line.1.ddl.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of line
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_line/issue363_inequality_line.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_line/issue363_inequality_line.2.update.aql
deleted file mode 100644
index 104f28d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_line/issue363_inequality_line.2.update.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of line
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_line/issue363_inequality_line.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_line/issue363_inequality_line.3.query.aql
deleted file mode 100644
index 2dbca92..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_line/issue363_inequality_line.3.query.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of line
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
- 
-let $v1 := line("10.1234,11.1e-1 +10.2E-2,-11.22")
-let $dv1 := line("10.1234,11.1e-1 +10.2E-2,-11.22")
-
-return { "line0":  $v1 > $dv1, "line1": $dv1 < $v1, "line2":  $v1 >= $dv1, "line3": $dv1 <= $v1 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_point/issue363_inequality_point.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_point/issue363_inequality_point.1.ddl.aql
deleted file mode 100644
index 2d94d3c..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_point/issue363_inequality_point.1.ddl.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of point
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_point/issue363_inequality_point.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_point/issue363_inequality_point.2.update.aql
deleted file mode 100644
index 2d94d3c..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_point/issue363_inequality_point.2.update.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of point
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_point/issue363_inequality_point.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_point/issue363_inequality_point.3.query.aql
deleted file mode 100644
index 04105cc..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_point/issue363_inequality_point.3.query.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of point
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
- 
-let $v1 := point("47.44,80.65")
-let $dv1 := point("47.4444,80.65")
-
-return { "point0":  $v1 > $dv1, "point1": $dv1 < $v1, "point2":  $v1 >= $dv1, "point3": $dv1 <= $v1 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_polygon/issue363_inequality_polygon.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_polygon/issue363_inequality_polygon.1.ddl.aql
deleted file mode 100644
index b9de498..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_polygon/issue363_inequality_polygon.1.ddl.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of polygon
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_polygon/issue363_inequality_polygon.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_polygon/issue363_inequality_polygon.2.update.aql
deleted file mode 100644
index b9de498..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_polygon/issue363_inequality_polygon.2.update.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of polygon
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_polygon/issue363_inequality_polygon.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_polygon/issue363_inequality_polygon.3.query.aql
deleted file mode 100644
index 1fb676a..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_polygon/issue363_inequality_polygon.3.query.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of polygon
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
- 
-let $v1 := polygon("-1.0,+10.5e2 -02.15E+50,2.5 -1.0,+3.3e3 -2.50E+05,20.15 +3.5e+2,03.6 -4.60E-3,+4.75 -2,+1.0e2 -2.00E+5,20.10 30.5,03.25 -4.33E-3,+4.75")
-let $dv1 := polygon("-1.0,+10.5e2 -02.19E+50,2.5 -1.0,+3.3e3 -2.50E+05,20.15 +3.5e+2,03.6 -4.60E-3,+4.75 -2,+1.0e2 -2.00E+5,20.10 30.5,03.25 -4.33E-3,+4.75")
-
-return { "polygon0":  $v1 > $dv1, "polygon1": $dv1 < $v1, "polygon2":  $v1 >= $dv1, "polygon3": $dv1 <= $v1 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_rectangle/issue363_inequality_rectangle.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_rectangle/issue363_inequality_rectangle.1.ddl.aql
deleted file mode 100644
index 98b797d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_rectangle/issue363_inequality_rectangle.1.ddl.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of rectangle
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_rectangle/issue363_inequality_rectangle.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_rectangle/issue363_inequality_rectangle.2.update.aql
deleted file mode 100644
index 98b797d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_rectangle/issue363_inequality_rectangle.2.update.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of rectangle
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_rectangle/issue363_inequality_rectangle.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_rectangle/issue363_inequality_rectangle.3.query.aql
deleted file mode 100644
index 378aaae..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_rectangle/issue363_inequality_rectangle.3.query.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.
- */
-/*
- * Description  : a test case for inequality comparisons of rectangle
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
- 
-let $v1 := rectangle("0.1234,-1.00e-10 5.5487,0.48765")
-let $dv1 := rectangle("0.5678,-1.00e-10 5.5487,0.48765")
-
-return { "rectangle0":  $v1 > $dv1, "rectangle1": $dv1 < $v1, "rectangle2":  $v1 >= $dv1, "rectangle3": $dv1 <= $v1 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/incomparable_types/incomparable_types.001.ddl.sqlpp
similarity index 80%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.1.ddl.aql
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/incomparable_types/incomparable_types.001.ddl.sqlpp
index b0a772c..6c25dfd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/incomparable_types/incomparable_types.001.ddl.sqlpp
@@ -16,9 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-/*
- * Description  : a test case for inequality comparisons of duration
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
+
+drop dataverse test if exists;
+create dataverse test;
+use test;
+
+create type openType as {id:int};
+
+create dataset ds1(openType) primary key id;
+create dataset ds2(openType) primary key id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/incomparable_types/incomparable_types.002.update.sqlpp
similarity index 83%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.1.ddl.aql
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/incomparable_types/incomparable_types.002.update.sqlpp
index b0a772c..ee7136f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/incomparable_types/incomparable_types.002.update.sqlpp
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-/*
- * Description  : a test case for inequality comparisons of duration
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
+
+use test;
+
+insert into ds1 {"id": 1, "f": 5};
+insert into ds1 {"id": 2, "f": "str"};
+insert into ds2 {"id": 1, "f": "str"};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/incomparable_types/incomparable_types.003.query.sqlpp
similarity index 83%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.1.ddl.aql
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/incomparable_types/incomparable_types.003.query.sqlpp
index b0a772c..66e6595 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/incomparable_types/incomparable_types.003.query.sqlpp
@@ -16,9 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-/*
- * Description  : a test case for inequality comparisons of duration
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
+
+-- param max-warnings:string=10
+
+use test;
+
+from ds1 join ds2 on ds1.f /*+ hash-bcast */ = ds2.f
+where ds1.f > 1
+select ds1.f;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/incomparable_types/incomparable_types.004.query.sqlpp
similarity index 83%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.1.ddl.aql
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/incomparable_types/incomparable_types.004.query.sqlpp
index b0a772c..a61ae14 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/incomparable_types/incomparable_types.004.query.sqlpp
@@ -16,9 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-/*
- * Description  : a test case for inequality comparisons of duration
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
+
+-- param max-warnings:string=10
+
+from [
+[1,2] < 4,
+point('0.0,0.0') < point('0.0,1.0')
+] as data
+select data;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/incomparable_types/incomparable_types.005.ddl.sqlpp
similarity index 83%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.1.ddl.aql
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/incomparable_types/incomparable_types.005.ddl.sqlpp
index b0a772c..548e632 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/comparison/issue363_inequality_duration/issue363_inequality_duration.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/comparison/incomparable_types/incomparable_types.005.ddl.sqlpp
@@ -16,9 +16,5 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-/*
- * Description  : a test case for inequality comparisons of duration
- * Expected Res : Failure
- * Date         : 9 May 2013
- * Issue        : 363
- */
+
+drop dataverse test if exists;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/incomparable_types/incomparable_types.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/incomparable_types/incomparable_types.1.adm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/incomparable_types/incomparable_types.1.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/incomparable_types/incomparable_types.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/incomparable_types/incomparable_types.2.adm
new file mode 100644
index 0000000..b036da7
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/incomparable_types/incomparable_types.2.adm
@@ -0,0 +1,2 @@
+{ "data": null }
+{ "data": null }
\ No newline at end of file
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 bf16d65..2b3cb77 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -3367,6 +3367,14 @@
         <output-dir compare="Text">circle-point</output-dir>
       </compilation-unit>
     </test-case>
+    <test-case FilePath="comparison" check-warnings="true">
+      <compilation-unit name="incomparable_types">
+        <output-dir compare="Text">incomparable_types</output-dir>
+          <expected-warn>Incomparable input types: string and bigint (in line 25, at column 13)</expected-warn>
+          <expected-warn>Incomparable input types: array and bigint (in line 23, at column 7)</expected-warn>
+          <expected-warn>Incomparable input types: point and point (in line 24, at column 18)</expected-warn>
+      </compilation-unit>
+    </test-case>
   </test-group>
   <test-group name="constructor">
     <test-case FilePath="constructor">
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
index da1c4e7..95cd4a8 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
@@ -81,6 +81,7 @@
     public static final int INVALID_LIKE_PATTERN = 46;
     public static final int INVALID_REQ_PARAM_VAL = 47;
     public static final int INVALID_REQ_JSON_VAL = 48;
+    public static final int INCOMPARABLE_TYPES = 49;
 
     public static final int UNSUPPORTED_JRE = 100;
 
diff --git a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
index 457206d..12d7284 100644
--- a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
+++ b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
@@ -40,7 +40,7 @@
 13,1006 = Duplicate field name \"%1$s\"
 1009 = A returning expression cannot contain dataset access
 37,1091 = Type mismatch: expected value of type %1$s, but got the value of type %2$s
-
+49 = Incomparable input types: %1$s and %2$s
 
 # Data errors
 6 = Invalid format for %1$s in %2$s
@@ -83,6 +83,7 @@
 46 = Invalid pattern \"%1$s\" for LIKE
 47 = Invalid value for parameter \"%1$s\": %2$s
 48 = Unable to process JSON content in request
+#49 is used
 
 100 = Unsupported JRE: %1$s
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/ExceptionUtil.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/ExceptionUtil.java
index b5d599b..ec844ce 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/ExceptionUtil.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/ExceptionUtil.java
@@ -124,6 +124,14 @@
         }
     }
 
+    public static void warnIncomparableTypes(IEvaluatorContext ctx, SourceLocation srcLoc, ATypeTag type1,
+            ATypeTag type2) {
+        IWarningCollector warningCollector = ctx.getWarningCollector();
+        if (warningCollector.shouldWarn()) {
+            warningCollector.warn(WarningUtil.forAsterix(srcLoc, ErrorCode.INCOMPARABLE_TYPES, type1, type2));
+        }
+    }
+
     /** For functions that accept an integer value (no fractions) of any numeric type including double & float */
     public static void warnNonInteger(IEvaluatorContext ctx, SourceLocation srcLoc, FunctionIdentifier fid, int argIdx,
             double argValue) {
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 244ffc3..668548d 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
@@ -70,19 +70,21 @@
     protected final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
     protected final DataOutput out = resultStorage.getDataOutput();
     protected final TaggedValuePointable argLeft = TaggedValuePointable.FACTORY.createPointable();
-    private final TaggedValuePointable argRight = TaggedValuePointable.FACTORY.createPointable();
+    protected final TaggedValuePointable argRight = TaggedValuePointable.FACTORY.createPointable();
+    protected final SourceLocation sourceLoc;
+    protected final IEvaluatorContext ctx;
     private final TaggedValueReference leftVal = new TaggedValueReference();
     private final TaggedValueReference rightVal = new TaggedValueReference();
     private final IScalarEvaluator evalLeft;
     private final IScalarEvaluator evalRight;
-    protected final SourceLocation sourceLoc;
     private final ILogicalBinaryComparator logicalComparator;
-    private IAObject leftConstant;
-    private IAObject rightConstant;
+    private final IAObject leftConstant;
+    private final IAObject rightConstant;
 
-    public AbstractComparisonEvaluator(IScalarEvaluatorFactory evalLeftFactory, IAType leftType,
+    AbstractComparisonEvaluator(IScalarEvaluatorFactory evalLeftFactory, IAType leftType,
             IScalarEvaluatorFactory evalRightFactory, IAType rightType, IEvaluatorContext ctx, SourceLocation sourceLoc,
             boolean isEquality) throws HyracksDataException {
+        this.ctx = ctx;
         this.evalLeft = evalLeftFactory.createScalarEvaluator(ctx);
         this.evalRight = evalRightFactory.createScalarEvaluator(ctx);
         this.sourceLoc = sourceLoc;
@@ -91,11 +93,8 @@
         rightConstant = getValueOfConstantEval(evalRightFactory);
     }
 
-    private IAObject getValueOfConstantEval(IScalarEvaluatorFactory factory) {
-        if (factory instanceof ConstantEvalFactory) {
-            return getConstantValue(((ConstantEvalFactory) factory).getValue());
-        }
-        return null;
+    private static IAObject getValueOfConstantEval(IScalarEvaluatorFactory factory) {
+        return factory instanceof ConstantEvalFactory ? getConstant(((ConstantEvalFactory) factory).getValue()) : null;
     }
 
     @Override
@@ -118,20 +117,11 @@
 
     final Result compare() throws HyracksDataException {
         if (leftConstant != null) {
-            if (rightConstant != null) {
-                // both are constants
-                return logicalComparator.compare(leftConstant, rightConstant);
-            } else {
-                // left is constant, right isn't
-                return logicalComparator.compare(leftConstant, rightVal);
-            }
+            return rightConstant != null ? logicalComparator.compare(leftConstant, rightConstant)
+                    : logicalComparator.compare(leftConstant, rightVal);
         } else {
-            if (rightConstant != null) {
-                // right is constant, left isn't
-                return logicalComparator.compare(leftVal, rightConstant);
-            } else {
-                return logicalComparator.compare(leftVal, rightVal);
-            }
+            return rightConstant != null ? logicalComparator.compare(leftVal, rightConstant)
+                    : logicalComparator.compare(leftVal, rightVal);
         }
     }
 
@@ -147,7 +137,7 @@
         result.set(resultStorage);
     }
 
-    private IAObject getConstantValue(byte[] bytes) {
+    private static IAObject getConstant(byte[] bytes) {
         int start = 0;
         ATypeTag typeTag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[start]);
         if (typeTag == null) {
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 37b5bb8..1d6a7dc 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
@@ -36,6 +36,7 @@
 
     @Override
     protected void evaluateImpl(IPointable result) throws HyracksDataException {
+        // TODO(ali): revisit this for the cases of MISSING/NULL/INCOMPARABLE
         switch (compare()) {
             case MISSING:
                 writeMissing(result);
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 24b655d8..54af8f7 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
@@ -19,9 +19,12 @@
 
 package org.apache.asterix.runtime.evaluators.comparisons;
 
+import static org.apache.asterix.om.types.ATypeTag.VALUE_TYPE_MAPPING;
+
 import org.apache.asterix.dataflow.data.common.ILogicalBinaryComparator.Result;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.om.base.ABoolean;
+import org.apache.asterix.om.exceptions.ExceptionUtil;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
@@ -50,12 +53,16 @@
                 writeMissing(result);
                 break;
             case NULL:
+                writeNull(result);
+                break;
             case INCOMPARABLE:
+                ExceptionUtil.warnIncomparableTypes(ctx, sourceLoc, VALUE_TYPE_MAPPING[argLeft.getTag()],
+                        VALUE_TYPE_MAPPING[argRight.getTag()]);
                 writeNull(result);
                 break;
             default:
                 resultStorage.reset();
-                ABoolean b = getComparisonResult(comparisonResult) ? ABoolean.TRUE : ABoolean.FALSE;
+                ABoolean b = ABoolean.valueOf(getComparisonResult(comparisonResult));
                 serde.serialize(b, out);
                 result.set(resultStorage);
         }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/DotFormatGenerator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/DotFormatGenerator.java
index d6895e3..5402751 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/DotFormatGenerator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/DotFormatGenerator.java
@@ -19,13 +19,9 @@
 package org.apache.hyracks.algebricks.core.utils;
 
 import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
 import org.apache.commons.lang3.mutable.Mutable;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalPlan;
@@ -34,136 +30,13 @@
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractOperatorWithNestedPlans;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractReplicateOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.ExchangeOperator;
-import org.apache.hyracks.api.constraints.Constraint;
-import org.apache.hyracks.api.constraints.expressions.ConstraintExpression;
-import org.apache.hyracks.api.constraints.expressions.LValueConstraintExpression;
-import org.apache.hyracks.api.constraints.expressions.PartitionCountExpression;
-import org.apache.hyracks.api.constraints.expressions.PartitionLocationExpression;
-import org.apache.hyracks.api.dataflow.ActivityId;
-import org.apache.hyracks.api.dataflow.ConnectorDescriptorId;
-import org.apache.hyracks.api.dataflow.IActivity;
-import org.apache.hyracks.api.dataflow.IConnectorDescriptor;
-import org.apache.hyracks.api.dataflow.IOperatorDescriptor;
-import org.apache.hyracks.api.job.JobActivityGraph;
-import org.apache.hyracks.api.job.JobSpecification;
+import org.apache.hyracks.api.util.DotFormatBuilder;
 
 public class DotFormatGenerator {
 
     private final LogicalOperatorDotVisitor dotVisitor = new LogicalOperatorDotVisitor();
 
     /**
-     * Generates DOT format plan for {@link JobActivityGraph} that can be visualized using any DOT format visualizer.
-     *
-     * @param jobActivityGraph The job activity graph
-     * @return DOT format plan
-     */
-    public static String generate(final JobActivityGraph jobActivityGraph) {
-        final DotFormatBuilder graphBuilder = new DotFormatBuilder(DotFormatBuilder.StringValue.of("JobActivityGraph"));
-        List<IConnectorDescriptor> connectors;
-        IActivity activity;
-        ActivityId fromActivityId;
-        ActivityId toActivityId;
-        String fromFullClassName;
-        String toFullClassName;
-        String fromClassName;
-        String toClassName;
-        DotFormatBuilder.Node fromNode;
-        DotFormatBuilder.Node toNode;
-        final Set<Pair<ActivityId, ActivityId>> activitiesPairedSet = new HashSet<>();
-        final Map<ActivityId, IActivity> activityMap = jobActivityGraph.getActivityMap();
-        final Map<ActivityId, List<IConnectorDescriptor>> activityInputMap = jobActivityGraph.getActivityInputMap();
-        final Map<ActivityId, List<IConnectorDescriptor>> activityOutputMap = jobActivityGraph.getActivityOutputMap();
-
-        // go through each activity. First, map its input -> activity, then activity -> its output
-        for (Map.Entry<ActivityId, IActivity> entry : activityMap.entrySet()) {
-            toFullClassName = entry.getValue().getClass().getName();
-            toClassName = toFullClassName.substring(toFullClassName.lastIndexOf('.') + 1);
-            toActivityId = entry.getValue().getActivityId();
-            toNode = graphBuilder.createNode(DotFormatBuilder.StringValue.of(toActivityId.toString()),
-                    DotFormatBuilder.StringValue.of(toActivityId.toString() + "-" + toClassName));
-            // process input -> to activity
-            connectors = activityInputMap.get(entry.getKey());
-            if (connectors != null) {
-                for (IConnectorDescriptor connector : connectors) {
-                    fromActivityId = jobActivityGraph.getProducerActivity(connector.getConnectorId());
-                    activity = activityMap.get(fromActivityId);
-                    fromFullClassName = activity.getClass().getName();
-                    fromClassName = fromFullClassName.substring(fromFullClassName.lastIndexOf('.') + 1);
-                    fromNode = graphBuilder.createNode(DotFormatBuilder.StringValue.of(fromActivityId.toString()),
-                            DotFormatBuilder.StringValue.of(fromActivityId.toString() + "-" + fromClassName));
-                    Pair<ActivityId, ActivityId> newPair = new ImmutablePair<>(fromActivityId, toActivityId);
-                    if (!activitiesPairedSet.contains(newPair)) {
-                        activitiesPairedSet.add(newPair);
-                        graphBuilder.createEdge(fromNode, toNode);
-                    }
-                }
-            }
-
-            // process from activity -> output
-            fromActivityId = toActivityId;
-            fromNode = toNode;
-            connectors = activityOutputMap.get(entry.getKey());
-            if (connectors != null) {
-                for (IConnectorDescriptor connector : connectors) {
-                    toActivityId = jobActivityGraph.getConsumerActivity(connector.getConnectorId());
-                    activity = activityMap.get(toActivityId);
-                    toFullClassName = activity.getClass().getName();
-                    toClassName = toFullClassName.substring(toFullClassName.lastIndexOf('.') + 1);
-                    toNode = graphBuilder.createNode(DotFormatBuilder.StringValue.of(toActivityId.toString()),
-                            DotFormatBuilder.StringValue.of(toActivityId.toString() + "-" + toClassName));
-                    Pair<ActivityId, ActivityId> newPair = new ImmutablePair<>(fromActivityId, toActivityId);
-                    if (!activitiesPairedSet.contains(newPair)) {
-                        activitiesPairedSet.add(newPair);
-                        graphBuilder.createEdge(fromNode, toNode);
-                    }
-                }
-            }
-        }
-
-        final Map<ActivityId, Set<ActivityId>> blocked2BlockerMap = jobActivityGraph.getBlocked2BlockerMap();
-        IActivity blockedActivity;
-        for (Map.Entry<ActivityId, Set<ActivityId>> entry : blocked2BlockerMap.entrySet()) {
-            blockedActivity = activityMap.get(entry.getKey());
-            toFullClassName = blockedActivity.getClass().getName();
-            toClassName = toFullClassName.substring(toFullClassName.lastIndexOf('.') + 1);
-            toActivityId = entry.getKey();
-            toNode = graphBuilder.createNode(DotFormatBuilder.StringValue.of(toActivityId.toString()),
-                    DotFormatBuilder.StringValue.of(toActivityId.toString() + "-" + toClassName));
-            for (ActivityId blockingActivityId : entry.getValue()) {
-                fromActivityId = blockingActivityId;
-                activity = activityMap.get(fromActivityId);
-                fromFullClassName = activity.getClass().getName();
-                fromClassName = fromFullClassName.substring(fromFullClassName.lastIndexOf('.') + 1);
-                fromNode = graphBuilder.createNode(DotFormatBuilder.StringValue.of(fromActivityId.toString()),
-                        DotFormatBuilder.StringValue.of(fromActivityId.toString() + "-" + fromClassName));
-                Pair<ActivityId, ActivityId> newPair = new ImmutablePair<>(fromActivityId, toActivityId);
-                if (!activitiesPairedSet.contains(newPair)) {
-                    activitiesPairedSet.add(newPair);
-                    graphBuilder.createEdge(fromNode, toNode).setColor(DotFormatBuilder.Color.RED);
-                }
-            }
-        }
-
-        return graphBuilder.getDotDocument();
-    }
-
-    /**
-     * Generates DOT format plan for {@link JobSpecification} that can be visualized using any DOT format visualizer.
-     *
-     * @param jobSpecification The job specification
-     * @return DOT format plan
-     */
-    public static String generate(final JobSpecification jobSpecification) {
-        final DotFormatBuilder graphBuilder = new DotFormatBuilder(DotFormatBuilder.StringValue.of("JobSpecification"));
-        final Map<ConnectorDescriptorId, IConnectorDescriptor> connectorMap = jobSpecification.getConnectorMap();
-        final Set<Constraint> constraints = jobSpecification.getUserConstraints();
-        Map<ConnectorDescriptorId, Pair<Pair<IOperatorDescriptor, Integer>, Pair<IOperatorDescriptor, Integer>>> cOp =
-                jobSpecification.getConnectorOperatorMap();
-        cOp.forEach((connId, srcAndDest) -> addToGraph(graphBuilder, constraints, connectorMap, connId, srcAndDest));
-        return graphBuilder.getDotDocument();
-    }
-
-    /**
      * Generates DOT format plan for {@link ILogicalPlan} that can be visualized using any DOT format visualizer.
      *
      * @param plan  The logical plan
@@ -250,47 +123,4 @@
         String formattedString = operator.accept(dotVisitor, showDetails).trim();
         return DotFormatBuilder.StringValue.of(formattedString);
     }
-
-    private static void addToGraph(DotFormatBuilder graph, Set<Constraint> constraints,
-            Map<ConnectorDescriptorId, IConnectorDescriptor> connMap, ConnectorDescriptorId connId,
-            Pair<Pair<IOperatorDescriptor, Integer>, Pair<IOperatorDescriptor, Integer>> srcAndDest) {
-        IConnectorDescriptor connector = connMap.get(connId);
-        String edgeLabel;
-        edgeLabel = connector.getClass().getName().substring(connector.getClass().getName().lastIndexOf(".") + 1);
-        edgeLabel += "-" + connId;
-        IOperatorDescriptor sourceOp = srcAndDest.getLeft().getLeft();
-        IOperatorDescriptor destOp = srcAndDest.getRight().getLeft();
-        StringBuilder source = new StringBuilder(
-                sourceOp.getClass().getName().substring(sourceOp.getClass().getName().lastIndexOf(".") + 1));
-        StringBuilder destination = new StringBuilder(
-                destOp.getClass().getName().substring(destOp.getClass().getName().lastIndexOf(".") + 1));
-        // constraints
-        for (Constraint constraint : constraints) {
-            LValueConstraintExpression lvalue = constraint.getLValue();
-            if (lvalue.getTag() == ConstraintExpression.ExpressionTag.PARTITION_COUNT) {
-                PartitionCountExpression count = (PartitionCountExpression) lvalue;
-                if (count.getOperatorDescriptorId().equals(sourceOp.getOperatorId())) {
-                    source.append("\n").append(constraint);
-                }
-                if (count.getOperatorDescriptorId().equals(destOp.getOperatorId())) {
-                    destination.append("\n").append(constraint);
-                }
-            } else if (lvalue.getTag() == ConstraintExpression.ExpressionTag.PARTITION_LOCATION) {
-                PartitionLocationExpression location = (PartitionLocationExpression) lvalue;
-                if (location.getOperatorDescriptorId().equals(sourceOp.getOperatorId())) {
-                    source.append("\n").append(constraint);
-                }
-                if (location.getOperatorDescriptorId().equals(destOp.getOperatorId())) {
-                    destination.append("\n").append(constraint);
-                }
-            }
-        }
-        DotFormatBuilder.Node sourceNode =
-                graph.createNode(DotFormatBuilder.StringValue.of(sourceOp.getOperatorId().toString()),
-                        DotFormatBuilder.StringValue.of(sourceOp.toString() + "-" + source));
-        DotFormatBuilder.Node destinationNode =
-                graph.createNode(DotFormatBuilder.StringValue.of(destOp.getOperatorId().toString()),
-                        DotFormatBuilder.StringValue.of(destOp.toString() + "-" + destination));
-        graph.createEdge(sourceNode, destinationNode).setLabel(DotFormatBuilder.StringValue.of(edgeLabel));
-    }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/DotFormatBuilder.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/DotFormatBuilder.java
similarity index 92%
rename from hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/DotFormatBuilder.java
rename to hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/DotFormatBuilder.java
index e782e4f..9f9b4fa 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/DotFormatBuilder.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/DotFormatBuilder.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.hyracks.algebricks.core.utils;
+package org.apache.hyracks.api.util;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -164,6 +164,11 @@
             return this;
         }
 
+        public Edge setDashed() {
+            attributes.put(Attribute.STYLE, Style.DASHED);
+            return this;
+        }
+
         @Override
         public boolean equals(Object other) {
             if (!(other instanceof Edge)) {
@@ -231,6 +236,7 @@
     public static final class Color extends AttributeValue {
         public static final Color RED = new Color("red");
         public static final Color SKYBLUE = new Color("skyblue");
+        public static final Color BLUE = new Color("blue");
 
         // no instantiation
         private Color(String color) {
@@ -238,9 +244,19 @@
         }
     }
 
-    private class Attribute {
+    public static final class Style extends AttributeValue {
+        public static final Style DASHED = new Style("dashed");
+
+        // no instantiation
+        private Style(String style) {
+            super(style);
+        }
+    }
+
+    private static final class Attribute {
         private static final String COLOR = "color";
         private static final String LABEL = "label";
+        private static final String STYLE = "style";
 
         // no instantiation
         private Attribute() {
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/DotFormatGenerator.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/DotFormatGenerator.java
new file mode 100644
index 0000000..10ae66e
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/DotFormatGenerator.java
@@ -0,0 +1,203 @@
+/*
+ *  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.hyracks.api.util;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.hyracks.api.constraints.Constraint;
+import org.apache.hyracks.api.constraints.expressions.ConstraintExpression;
+import org.apache.hyracks.api.constraints.expressions.LValueConstraintExpression;
+import org.apache.hyracks.api.constraints.expressions.PartitionCountExpression;
+import org.apache.hyracks.api.constraints.expressions.PartitionLocationExpression;
+import org.apache.hyracks.api.dataflow.ActivityId;
+import org.apache.hyracks.api.dataflow.ConnectorDescriptorId;
+import org.apache.hyracks.api.dataflow.IActivity;
+import org.apache.hyracks.api.dataflow.IConnectorDescriptor;
+import org.apache.hyracks.api.dataflow.IOperatorDescriptor;
+import org.apache.hyracks.api.job.JobActivityGraph;
+import org.apache.hyracks.api.job.JobSpecification;
+
+public final class DotFormatGenerator {
+
+    /**
+     * Generates DOT format plan for {@link JobActivityGraph} that can be visualized using any DOT format visualizer.
+     *
+     * @param jobActivityGraph The job activity graph
+     * @return DOT format plan
+     */
+    public static String generate(final JobActivityGraph jobActivityGraph) {
+        final DotFormatBuilder graphBuilder = new DotFormatBuilder(DotFormatBuilder.StringValue.of("JobActivityGraph"));
+        List<IConnectorDescriptor> connectors;
+        IActivity activity;
+        ActivityId fromActivityId;
+        ActivityId toActivityId;
+        String fromFullClassName;
+        String toFullClassName;
+        String fromClassName;
+        String toClassName;
+        DotFormatBuilder.Node fromNode;
+        DotFormatBuilder.Node toNode;
+        final Set<Pair<ActivityId, ActivityId>> activitiesPairedSet = new HashSet<>();
+        final Map<ActivityId, IActivity> activityMap = jobActivityGraph.getActivityMap();
+        final Map<ActivityId, List<IConnectorDescriptor>> activityInputMap = jobActivityGraph.getActivityInputMap();
+        final Map<ActivityId, List<IConnectorDescriptor>> activityOutputMap = jobActivityGraph.getActivityOutputMap();
+
+        // go through each activity. First, map its input -> activity, then activity -> its output
+        for (Map.Entry<ActivityId, IActivity> entry : activityMap.entrySet()) {
+            toFullClassName = entry.getValue().getClass().getName();
+            toClassName = toFullClassName.substring(toFullClassName.lastIndexOf('.') + 1);
+            toActivityId = entry.getValue().getActivityId();
+            toNode = graphBuilder.createNode(DotFormatBuilder.StringValue.of(toActivityId.toString()),
+                    DotFormatBuilder.StringValue.of(toActivityId.toString() + "-" + toClassName));
+            // process input -> to activity
+            connectors = activityInputMap.get(entry.getKey());
+            if (connectors != null) {
+                for (IConnectorDescriptor connector : connectors) {
+                    fromActivityId = jobActivityGraph.getProducerActivity(connector.getConnectorId());
+                    activity = activityMap.get(fromActivityId);
+                    fromFullClassName = activity.getClass().getName();
+                    fromClassName = fromFullClassName.substring(fromFullClassName.lastIndexOf('.') + 1);
+                    fromNode = graphBuilder.createNode(DotFormatBuilder.StringValue.of(fromActivityId.toString()),
+                            DotFormatBuilder.StringValue.of(fromActivityId.toString() + "-" + fromClassName));
+                    Pair<ActivityId, ActivityId> newPair = new ImmutablePair<>(fromActivityId, toActivityId);
+                    if (!activitiesPairedSet.contains(newPair)) {
+                        activitiesPairedSet.add(newPair);
+                        DotFormatBuilder.Edge edge = graphBuilder.createEdge(fromNode, toNode);
+                        if (connector.allProducersToAllConsumers()) {
+                            edge.setDashed().setColor(DotFormatBuilder.Color.BLUE);
+                        }
+                    }
+                }
+            }
+
+            // process from activity -> output
+            fromActivityId = toActivityId;
+            fromNode = toNode;
+            connectors = activityOutputMap.get(entry.getKey());
+            if (connectors != null) {
+                for (IConnectorDescriptor connector : connectors) {
+                    toActivityId = jobActivityGraph.getConsumerActivity(connector.getConnectorId());
+                    activity = activityMap.get(toActivityId);
+                    toFullClassName = activity.getClass().getName();
+                    toClassName = toFullClassName.substring(toFullClassName.lastIndexOf('.') + 1);
+                    toNode = graphBuilder.createNode(DotFormatBuilder.StringValue.of(toActivityId.toString()),
+                            DotFormatBuilder.StringValue.of(toActivityId.toString() + "-" + toClassName));
+                    Pair<ActivityId, ActivityId> newPair = new ImmutablePair<>(fromActivityId, toActivityId);
+                    if (!activitiesPairedSet.contains(newPair)) {
+                        activitiesPairedSet.add(newPair);
+                        DotFormatBuilder.Edge edge = graphBuilder.createEdge(fromNode, toNode);
+                        if (connector.allProducersToAllConsumers()) {
+                            edge.setDashed().setColor(DotFormatBuilder.Color.BLUE);
+                        }
+                    }
+                }
+            }
+        }
+
+        final Map<ActivityId, Set<ActivityId>> blocked2BlockerMap = jobActivityGraph.getBlocked2BlockerMap();
+        IActivity blockedActivity;
+        for (Map.Entry<ActivityId, Set<ActivityId>> entry : blocked2BlockerMap.entrySet()) {
+            blockedActivity = activityMap.get(entry.getKey());
+            toFullClassName = blockedActivity.getClass().getName();
+            toClassName = toFullClassName.substring(toFullClassName.lastIndexOf('.') + 1);
+            toActivityId = entry.getKey();
+            toNode = graphBuilder.createNode(DotFormatBuilder.StringValue.of(toActivityId.toString()),
+                    DotFormatBuilder.StringValue.of(toActivityId.toString() + "-" + toClassName));
+            for (ActivityId blockingActivityId : entry.getValue()) {
+                fromActivityId = blockingActivityId;
+                activity = activityMap.get(fromActivityId);
+                fromFullClassName = activity.getClass().getName();
+                fromClassName = fromFullClassName.substring(fromFullClassName.lastIndexOf('.') + 1);
+                fromNode = graphBuilder.createNode(DotFormatBuilder.StringValue.of(fromActivityId.toString()),
+                        DotFormatBuilder.StringValue.of(fromActivityId.toString() + "-" + fromClassName));
+                Pair<ActivityId, ActivityId> newPair = new ImmutablePair<>(fromActivityId, toActivityId);
+                if (!activitiesPairedSet.contains(newPair)) {
+                    activitiesPairedSet.add(newPair);
+                    graphBuilder.createEdge(fromNode, toNode).setColor(DotFormatBuilder.Color.RED);
+                }
+            }
+        }
+
+        return graphBuilder.getDotDocument();
+    }
+
+    /**
+     * Generates DOT format plan for {@link JobSpecification} that can be visualized using any DOT format visualizer.
+     *
+     * @param jobSpecification The job specification
+     * @return DOT format plan
+     */
+    public static String generate(final JobSpecification jobSpecification) {
+        final DotFormatBuilder graphBuilder = new DotFormatBuilder(DotFormatBuilder.StringValue.of("JobSpecification"));
+        final Map<ConnectorDescriptorId, IConnectorDescriptor> connectorMap = jobSpecification.getConnectorMap();
+        final Set<Constraint> constraints = jobSpecification.getUserConstraints();
+        Map<ConnectorDescriptorId, Pair<Pair<IOperatorDescriptor, Integer>, Pair<IOperatorDescriptor, Integer>>> cOp =
+                jobSpecification.getConnectorOperatorMap();
+        cOp.forEach((connId, srcAndDest) -> addToGraph(graphBuilder, constraints, connectorMap, connId, srcAndDest));
+        return graphBuilder.getDotDocument();
+    }
+
+    private static void addToGraph(DotFormatBuilder graph, Set<Constraint> constraints,
+            Map<ConnectorDescriptorId, IConnectorDescriptor> connMap, ConnectorDescriptorId connId,
+            Pair<Pair<IOperatorDescriptor, Integer>, Pair<IOperatorDescriptor, Integer>> srcAndDest) {
+        IConnectorDescriptor connector = connMap.get(connId);
+        String edgeLabel;
+        edgeLabel = connector.getClass().getName().substring(connector.getClass().getName().lastIndexOf(".") + 1);
+        edgeLabel += "-" + connId;
+        IOperatorDescriptor sourceOp = srcAndDest.getLeft().getLeft();
+        IOperatorDescriptor destOp = srcAndDest.getRight().getLeft();
+        StringBuilder source = new StringBuilder(
+                sourceOp.getClass().getName().substring(sourceOp.getClass().getName().lastIndexOf(".") + 1));
+        StringBuilder destination = new StringBuilder(
+                destOp.getClass().getName().substring(destOp.getClass().getName().lastIndexOf(".") + 1));
+        // constraints
+        for (Constraint constraint : constraints) {
+            LValueConstraintExpression lvalue = constraint.getLValue();
+            if (lvalue.getTag() == ConstraintExpression.ExpressionTag.PARTITION_COUNT) {
+                PartitionCountExpression count = (PartitionCountExpression) lvalue;
+                if (count.getOperatorDescriptorId().equals(sourceOp.getOperatorId())) {
+                    source.append("\n").append(constraint);
+                }
+                if (count.getOperatorDescriptorId().equals(destOp.getOperatorId())) {
+                    destination.append("\n").append(constraint);
+                }
+            } else if (lvalue.getTag() == ConstraintExpression.ExpressionTag.PARTITION_LOCATION) {
+                PartitionLocationExpression location = (PartitionLocationExpression) lvalue;
+                if (location.getOperatorDescriptorId().equals(sourceOp.getOperatorId())) {
+                    source.append("\n").append(constraint);
+                }
+                if (location.getOperatorDescriptorId().equals(destOp.getOperatorId())) {
+                    destination.append("\n").append(constraint);
+                }
+            }
+        }
+        DotFormatBuilder.Node sourceNode =
+                graph.createNode(DotFormatBuilder.StringValue.of(sourceOp.getOperatorId().toString()),
+                        DotFormatBuilder.StringValue.of(sourceOp.toString() + "-" + source));
+        DotFormatBuilder.Node destinationNode =
+                graph.createNode(DotFormatBuilder.StringValue.of(destOp.getOperatorId().toString()),
+                        DotFormatBuilder.StringValue.of(destOp.toString() + "-" + destination));
+        graph.createEdge(sourceNode, destinationNode).setLabel(DotFormatBuilder.StringValue.of(edgeLabel));
+    }
+}
