Fix issue785 -- using the algebricks fixes for subplans.
Fix RemoveRedundantListifyRule -- listify/scan-collection pair within a nested plan can be removed.
Fix issue550.
Add a regression test for issue638.

Change-Id: Id56539cd5ab7ed0cc05897b468c26aec169102fd
Reviewed-on: http://fulliautomatix.ics.uci.edu:8443/150
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Preston Carman <ecarm002@ucr.edu>
Reviewed-by: Till Westmann <westmann@gmail.com>
diff --git a/asterix-app/src/test/resources/optimizerts/queries/query-issue550.aql b/asterix-app/src/test/resources/optimizerts/queries/query-issue550.aql
new file mode 100644
index 0000000..7a01a3b
--- /dev/null
+++ b/asterix-app/src/test/resources/optimizerts/queries/query-issue550.aql
@@ -0,0 +1,22 @@
+/*
+ * Description     : This test case is to verify the fix for issue550
+ * https://code.google.com/p/asterixdb/issues/detail?id=550
+ * Expected Result : Success
+ * Date            : 25th October 2014
+ */
+
+let $sample :=
+{{ 
+   {"r": 1, "uid": "1a2b", "t": datetime("2000-01-01T01:00:00"), "event": "e1"},
+   {"r": 2, "uid": "1a2b", "t": datetime("2000-01-01T01:01:00"), "event": "e2"},
+   {"r": 3, "uid": "3c4d", "t": datetime("2000-01-01T01:02:00"), "event": "e1"},
+   {"r": 4, "uid": "3c4d", "t": datetime("2000-01-01T01:03:00"), "event": "e3"},
+   {"r": 5, "uid": "1a2b", "t": datetime("2000-01-01T01:04:00"), "event": "e1"},
+   {"r": 6, "uid": "1a2b", "t": datetime("2000-01-01T01:05:00"), "event": "e4"}
+}}
+for $s in $sample
+group by $u := $s.uid with $s
+return {
+   "u": $u,
+   "recs": ( for $srec in $s return $srec )
+ };
diff --git a/asterix-app/src/test/resources/optimizerts/queries/query-issue785.aql b/asterix-app/src/test/resources/optimizerts/queries/query-issue785.aql
new file mode 100644
index 0000000..89a9531
--- /dev/null
+++ b/asterix-app/src/test/resources/optimizerts/queries/query-issue785.aql
@@ -0,0 +1,105 @@
+/*
+ * Description  : This test case is to verify the fix for issue785
+ * https://code.google.com/p/asterixdb/issues/detail?id=785
+ * Expected Res : SUCCESS
+ * Date         : 2nd Oct. 2014
+ */
+
+drop dataverse tpch if exists;
+create dataverse tpch;
+
+use dataverse tpch;
+
+create type OrderType as closed {
+  o_orderkey: int32,
+  o_custkey: int32,
+  o_orderstatus: string,
+  o_totalprice: double,
+  o_orderdate: string,
+  o_orderpriority: string,
+  o_clerk: string,
+  o_shippriority: int32,
+  o_comment: string
+}
+
+create type CustomerType as closed {
+  c_custkey: int32,
+  c_name: string,
+  c_address: string,
+  c_nationkey: int32,
+  c_phone: string,
+  c_acctbal: double,
+  c_mktsegment: string,
+  c_comment: string
+}
+
+create type SupplierType as closed {
+  s_suppkey: int32,
+  s_name: string,
+  s_address: string,
+  s_nationkey: int32,
+  s_phone: string,
+  s_acctbal: double,
+  s_comment: string
+}
+
+create type NationType as closed {
+  n_nationkey: int32,
+  n_name: string,
+  n_regionkey: int32,
+  n_comment: string
+}
+
+create type RegionType as closed {
+  r_regionkey: int32,
+  r_name: string,
+  r_comment: string
+}
+
+create dataset Orders(OrderType)
+  primary key o_orderkey;
+create dataset Supplier(SupplierType)
+  primary key s_suppkey;
+create dataset Region(RegionType)
+  primary key r_regionkey;
+create dataset Nation(NationType)
+  primary key n_nationkey;
+create dataset Customer(CustomerType)
+  primary key c_custkey;
+create dataset SelectedNation(NationType)
+  primary key n_nationkey;
+
+let $t := for $nation in dataset Nation
+for $sn in dataset SelectedNation
+where $nation.n_nationkey = $sn.n_nationkey  /*+ indexnl */
+return {
+    "n_nationkey": $nation.n_nationkey,
+    "n_name": $nation.n_name
+}
+
+let $X := (
+for $n in $t
+for $customer in dataset Customer
+for $order in dataset Orders
+where $order.o_custkey = $customer.c_custkey
+and  $customer.c_nationkey = $n.n_nationkey
+group by $orderdate := $order.o_orderdate, $nation_key := $n.n_nationkey with $order
+let $sum := sum(for $o in $order return $o.o_totalprice)
+return {
+    "nation_key": $nation_key,
+    "order_date": $orderdate,
+    "sum_price": $sum 
+})
+
+for $x in $X
+group by $nation_key := $x.nation_key with $x
+return {
+    "nation_key": $nation_key,
+    "sum_price": for $y in $x
+                  order by $y.sum_price desc
+                  limit 3
+                  return {
+                    "orderdate": $y.order_date,
+                    "sum_price": $y.sum_price
+                  }
+}