Added asterix project

git-svn-id: https://asterixdb.googlecode.com/svn/trunk@12 eaa15691-b419-025a-1212-ee371bd00084
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/ignore.txt b/asterix/asterix-app/src/test/resources/optimizerts/ignore.txt
new file mode 100644
index 0000000..49767eb
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/ignore.txt
@@ -0,0 +1,2 @@
+distinct_aggregate.aql
+cell-aggregation-with-filtering.aql
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/only.txt b/asterix/asterix-app/src/test/resources/optimizerts/only.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/only.txt
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/cell-aggregation-with-filtering.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/cell-aggregation-with-filtering.aql
new file mode 100644
index 0000000..a328a1b
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/cell-aggregation-with-filtering.aql
@@ -0,0 +1,37 @@
+drop dataverse twitter if exists;
+create dataverse twitter;
+use dataverse twitter;
+
+create type Tweet as closed {
+	id: int32,
+	tweetid: int64,
+	loc: point,
+	time: datetime,
+	text: string
+}
+
+create nodegroup group1 if exists on nc1, nc2;
+
+create dataset TwitterData(Tweet)
+  partitioned by key id on group1;
+
+
+load dataset TwitterData 
+using "edu.uci.ics.asterix.external.dataset.adapter.NCFileSystemAdapter"
+(("path"="nc1://data/twitter/extrasmalltweets.txt"),("format"="adm")) pre-sorted;
+
+create index rtree_index_point on TwitterData(loc) type rtree;
+
+write output to nc1:"rttest/spatial_cell-aggregation-with-filtering.adm";
+
+for $t in dataset('TwitterData')
+let $region := polygon("
+	33.80503407287759,-126.41235263538363 
+	44.9090773200516,-126.41235263538363 
+	44.9090773200516,-87.65258701038363 
+	33.80503407287759,-87.65258701038363")
+
+where spatial-intersect($t.loc, $region)
+group by $c := spatial-cell($t.loc, create-point(24.5,-125.5), 3.0, 3.0) with $t
+order by count($t)
+return { "cell": $c, "count": count($t) }
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/const-folding.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/const-folding.aql
new file mode 100644
index 0000000..1fe4495
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/const-folding.aql
@@ -0,0 +1,10 @@
+drop dataverse test if exists;
+create dataverse test;
+use dataverse test;
+
+write output to nc1:"rttest/divide.adm";
+
+let $x := [ "foo", "bar" ]
+let $r := { "a": 1+2, "b": $x[0] }
+let $f := $r.b
+return $f
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/count-tweets.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/count-tweets.aql
new file mode 100644
index 0000000..5e4cde1
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/count-tweets.aql
@@ -0,0 +1,24 @@
+drop dataverse twitter if exists;
+create dataverse twitter;
+use dataverse twitter;
+
+create type Tweet as open {
+  id: int32,
+  tweetid: int64,
+  loc: point,
+  time: string,
+  text: string
+}
+
+create external dataset TwitterData(Tweet)
+using "edu.uci.ics.asterix.external.dataset.adapter.NCFileSystemAdapter"
+(("path"="nc1://data/twitter/smalltweets.txt"),("format"="adm"));
+
+write output to nc1:"/tmp/count-tweets.adm";
+
+for $t in dataset('TwitterData')
+let $tokens := word-tokens($t.text)
+for $token in $tokens
+group by $tok := $token with $token
+return { "word": $tok, "count": count($token) }
+
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/cust_group_no_agg.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/cust_group_no_agg.aql
new file mode 100644
index 0000000..6fdae88
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/cust_group_no_agg.aql
@@ -0,0 +1,28 @@
+drop dataverse group_no_agg if exists;
+
+create dataverse group_no_agg;
+
+use dataverse group_no_agg;
+
+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 nodegroup group1 if not exists on nc1, nc2;
+
+create dataset Customers(CustomerType) 
+  partitioned by key c_custkey on group1;
+
+write output to nc1:"/tmp/.adm";
+
+for $c in dataset('Customers')
+group by $name := $c.c_name  with $c
+return $name
+
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/denorm-cust-order.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/denorm-cust-order.aql
new file mode 100644
index 0000000..acad4a1
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/denorm-cust-order.aql
@@ -0,0 +1,50 @@
+drop dataverse custorder if exists;
+
+create dataverse custorder;
+
+use dataverse custorder;
+
+
+create type AddressType as closed {
+  number: int32, 
+  street: string,
+  city: string
+}
+
+create type CustomerType as closed {
+  cid: int32, 
+  name: string,
+  age: int32?,
+  address: AddressType?,
+  lastorder: {
+    oid: int32,
+    total: float
+  }
+}
+
+
+
+create type OrderType as closed {
+  oid: int32,
+  cid: int32,
+  orderstatus: string,
+  orderpriority: string,
+  clerk: string,
+  total: float
+}
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset Customers(CustomerType) 
+  partitioned by key cid on group1;
+create dataset Orders(OrderType)
+  partitioned by key oid on group1;
+
+write output to nc1:"/tmp/custorder.adm";
+
+for $c in dataset('Customers')
+for $o in dataset('Orders')
+where $c.cid = $o.cid
+group by $cid := $c.cid decor $cust := $c with $o
+return {"cid":$cid, "cust":$cust, "cnt-orders": count($o), "orders":$o} 
+
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/distinct_aggregate.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/distinct_aggregate.aql
new file mode 100644
index 0000000..a4784c1
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/distinct_aggregate.aql
@@ -0,0 +1,50 @@
+drop dataverse tpch if exists;
+create dataverse tpch;
+use dataverse tpch;
+
+create type LineItemType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32, 
+  l_linenumber: int32, 
+  l_quantity: double, 
+  l_extendedprice: double,
+  l_discount: double, 
+  l_tax: double,
+  l_returnflag: string, 
+  l_linestatus: string, 
+  l_shipdate: string,
+  l_commitdate: string, 
+  l_receiptdate: string, 
+  l_shipinstruct: string, 
+  l_shipmode: string, 
+  l_comment: string
+}
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset LineItems_q1(LineItemType)
+  partitioned by key l_orderkey, l_linenumber on group1;
+
+write output to nc1:"rttest/tpch_q1_pricing_summary_report_nt.adm";
+ 
+for $g in 
+( 
+	for $l in dataset('LineItems_q1')
+	where $l.l_shipdate <= '1998-09-02'
+	group by $l_returnflag := $l.l_returnflag, $l_linestatus := $l.l_linestatus, 
+			$l_suppkey := $l.l_suppkey with $l
+	return {
+		"l_returnflag": $l_returnflag,
+		"l_linestatus": $l_linestatus,
+		"l_suppkey": $l_suppkey
+	}
+)
+group by $l_returnflag := $g.l_returnflag, $l_linestatus := $g.l_linestatus  
+  with $g
+order by $l_returnflag, $l_linestatus
+return {
+  "l_returnflag": $l_returnflag,
+  "l_linestatus": $l_linestatus,
+  "count_suppkey": count($g)
+}   
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/fj-dblp-csx.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/fj-dblp-csx.aql
new file mode 100644
index 0000000..2898058
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/fj-dblp-csx.aql
@@ -0,0 +1,76 @@
+drop dataverse fj-dblp-csx if exists;
+
+create dataverse fj-dblp-csx;
+
+use dataverse fj-dblp-csx;
+
+create type DBLPType as open {
+  id: int32, 
+  dblpid: string,
+  title: string,
+  authors: string,
+  misc: string
+}
+
+create type CSXType as open {
+  id: int32, 
+  csxid: string,
+  title: string,
+  authors: string,
+  misc: string
+}
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset DBLP(DBLPType) partitioned by key id on group1;
+create dataset CSX(CSXType) partitioned by key id on group1;
+
+write output to nc1:'rttest/fj-dblp-csx.adm';
+
+    for $paperDBLP in dataset('DBLP')
+    let $idDBLP := $paperDBLP.id
+    let $unrankedTokensDBLP := counthashed-word-tokens($paperDBLP.title)
+    let $tokensDBLP :=
+        for $token in $unrankedTokensDBLP
+        for $tokenRanked at $i in
+            //
+            // -- - Stage 1 - --
+            //
+            // for $paper in dataset('DBLP')
+            // for $token in counthashed-word-tokens($paper.title) 
+            // group by $tokenGroupped := $token with $paper
+            // order by count($paper), $tokenGroupped
+            // return $tokenGroupped
+            for $paper in dataset('DBLP')
+            return $paper.title            
+        where $token = $tokenRanked
+        order by $i
+        return $i
+   
+    for $prefixTokenDBLP in $tokensDBLP 
+
+    for $paperCSX in dataset('CSX')
+    let $idCSX := $paperCSX.id
+    let $unrankedTokensCSX := counthashed-word-tokens($paperCSX.title)
+    let $tokensCSX :=        
+        for $token in $unrankedTokensCSX
+        for $tokenRanked at $i in
+            //
+            // -- - Stage 1 - --
+            //
+            // for $paper in dataset('DBLP')
+            // for $token in counthashed-word-tokens($paper.title) 
+            // group by $tokenGroupped := $token with $paper
+            // order by count($paper), $tokenGroupped
+            // return $tokenGroupped
+            for $paper in dataset('DBLP')
+            return $paper.title
+        where $token = $tokenRanked
+        order by $i
+        return $i
+        
+    for $prefixTokenCSX in $tokensCSX    
+    where $prefixTokenDBLP = $prefixTokenCSX
+    group by $idDBLP := $idDBLP, $idCSX := $idCSX with $paperDBLP 
+    order by $idDBLP, $idCSX
+    return {'idDBLP': $idDBLP, 'idCSX': $idCSX}
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/fj-phase1.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/fj-phase1.aql
new file mode 100644
index 0000000..778232a
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/fj-phase1.aql
@@ -0,0 +1,46 @@
+drop dataverse rares03 if exists;
+
+create dataverse rares03;
+
+use dataverse rares03;
+
+create type UserType as open {
+  uid: int32, 
+  name: string,
+  lottery_numbers: {{int32}}
+}
+
+create type VisitorType as open {
+  vid: int32, 
+  name: string,
+  lottery_numbers: {{int32}}
+}
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset Users(UserType) 
+  partitioned by key uid on group1;
+
+create dataset Visitors(VisitorType) 
+  partitioned by key vid on group1;
+
+
+// set simfunction "jaccard";
+// set simthreshold ".8";
+
+write output to nc1:"/tmp/rares03.adm";
+
+for $user in dataset('Users')
+let $tokens := 
+    for $lottery_number in $user.lottery_numbers
+    for $token at $i in
+       for $user in dataset('Users')
+       for $lottery_number in $user.lottery_numbers 
+       group by $item := $lottery_number with $user 
+       let $count := count($user)
+       order by $count desc 
+       return $item 
+    where $lottery_number = $token
+    order by $token
+    return $i
+return {"uid": $user.uid, "tokens": $tokens}
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/fj-phase2-with-hints.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/fj-phase2-with-hints.aql
new file mode 100644
index 0000000..866c027
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/fj-phase2-with-hints.aql
@@ -0,0 +1,44 @@
+drop dataverse fuzzyjoin_078 if exists;
+
+create dataverse fuzzyjoin_078;
+
+use dataverse fuzzyjoin_078;
+
+create type DBLPType as open {
+  id: int32, 
+  dblpid: string,
+  title: string,
+  authors: string,
+  misc: string
+}
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset DBLP_fuzzyjoin_078(DBLPType) 
+  partitioned by key id on group1;
+
+write output to nc1:'rttest/fuzzyjoin_078.adm';
+
+    //
+    // -- - Stage 2 - --
+    //
+    for $paperDBLP in dataset('DBLP_fuzzyjoin_078')
+    let $unrankedTokensDBLP := counthashed-word-tokens($paperDBLP.title)
+    let $tokensDBLP :=
+        for $token in $unrankedTokensDBLP
+        for $tokenRanked at $i in
+            //
+            // -- - Stage 1 - --
+            //
+            for $paper in dataset('DBLP_fuzzyjoin_078')
+            for $token in counthashed-word-tokens($paper.title)
+            /*+ hash */ 
+            group by $tokenGroupped := $token with $paper
+            /*+ inmem 1 302 */
+            order by count($paper), $tokenGroupped
+            return $tokenGroupped
+        where $token = /*+ bcast */ $tokenRanked
+        order by $i
+        return $i
+    order by $paperDBLP.id
+    return {'id': $paperDBLP.id, 'tokens':$tokensDBLP}
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/inline-funs.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/inline-funs.aql
new file mode 100644
index 0000000..c220b9c
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/inline-funs.aql
@@ -0,0 +1,15 @@
+drop dataverse test if exists;
+create dataverse test;
+use dataverse test;
+
+write output to nc1:"/tmp/inline_funs.adm";
+
+declare function f1() { 1 + f2() }
+
+declare function f2() { 2 + f3() + f3() + f3() + f4() }
+
+declare function f3() { 0 - 1 }
+
+declare function f4() { 1001 }
+
+f1()
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/inlined_q18_large_volume_customer.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/inlined_q18_large_volume_customer.aql
new file mode 100644
index 0000000..49c4157
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/inlined_q18_large_volume_customer.aql
@@ -0,0 +1,89 @@
+drop dataverse inlined_q18_large_volume_customer if exists;
+
+create dataverse inlined_q18_large_volume_customer;
+
+use dataverse inlined_q18_large_volume_customer;
+
+create type LineItemType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32, 
+  l_linenumber: int32, 
+  l_quantity: double, 
+  l_extendedprice: double,
+  l_discount: double, 
+  l_tax: double,
+  l_returnflag: string, 
+  l_linestatus: string, 
+  l_shipdate: string,
+  l_commitdate: string, 
+  l_receiptdate: string, 
+  l_shipinstruct: string, 
+  l_shipmode: string, 
+  l_comment: string
+}
+
+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 nodegroup group1 if not exists on nc1, nc2;
+
+create dataset LineItems(LineItemType)
+  partitioned by key l_orderkey, l_linenumber on group1;
+create dataset Orders(OrderType)
+  partitioned by key o_orderkey on group1;
+create dataset Customers(CustomerType) 
+  partitioned by key c_custkey on group1;
+
+write output to nc1:"/tmp/inlined_q18_large_volume_customer.adm";
+
+for $c in dataset('Customers')
+for $o in dataset('Orders')
+where
+  $c.c_custkey = $o.o_custkey
+for $t in 
+(
+  for $l in dataset('LineItems')
+  group by $l_orderkey := $l.l_orderkey with $l
+  return 
+    { "l_orderkey": $l_orderkey, 
+      "t_sum_quantity": sum(for $i in $l return $i.l_quantity) }
+) 
+where 
+  $o.o_orderkey = $t.l_orderkey and $t.t_sum_quantity > 300
+for $l in dataset('LineItems')
+where
+  $l.l_orderkey = $o.o_orderkey 
+group by $c_name := $c.c_name, $c_custkey := $c.c_custkey, $o_orderkey := $o.o_orderkey, 
+         $o_orderdate := $o.o_orderdate, $o_totalprice := $o.o_totalprice with $l
+order by $o_totalprice desc, $o_orderdate 
+limit 100
+return {  
+  "c_name": $c_name,
+  "c_custkey": $c_custkey,
+  "o_orderkey": $o_orderkey,
+  "o_orderdate": $o_orderdate,
+  "o_totalprice": $o_totalprice,
+  "sum_quantity": sum(for $j in $l return $j.l_quantity)  
+}
+
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/introhashpartitionmerge.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/introhashpartitionmerge.aql
new file mode 100644
index 0000000..9427ab5
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/introhashpartitionmerge.aql
@@ -0,0 +1,23 @@
+drop dataverse fuzzyjoin if exists;
+create dataverse fuzzyjoin;
+use dataverse fuzzyjoin;
+
+create type TOKENSRANKEDADMType as closed {
+  token: int32,
+  rank: int32
+}
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset TOKENSRANKEDADM(TOKENSRANKEDADMType) partitioned by key rank on group1;
+
+write output to nc1:'rttest/introhashpartitionmerge.adm';
+
+        for $token1 in dataset('TOKENSRANKEDADM')
+        for $token2 in
+            for $tokenRanked in dataset('TOKENSRANKEDADM')
+            order by $tokenRanked.rank
+            return $tokenRanked
+        where $token1.token = $token2.token
+        order by $token2.rank
+        return $token2.rank
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/join-super-key_01.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/join-super-key_01.aql
new file mode 100644
index 0000000..f0251ad
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/join-super-key_01.aql
@@ -0,0 +1,82 @@
+drop dataverse join-super-key_1 if exists;
+
+create dataverse join-super-key_1;
+
+use dataverse join-super-key_1;
+
+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 LineItemType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32, 
+  l_linenumber: int32, 
+  l_quantity: double, 
+  l_extendedprice: double,
+  l_discount: double, 
+  l_tax: double,
+  l_returnflag: string, 
+  l_linestatus: string, 
+  l_shipdate: string,
+  l_commitdate: string, 
+  l_receiptdate: string, 
+  l_shipinstruct: string, 
+  l_shipmode: string, 
+  l_comment: string
+}
+
+create type PartType as closed {
+  p_partkey: int32, 
+  p_name: string, 
+  p_mfgr: string,
+  p_brand: string,
+  p_type: string,
+  p_size: int32,
+  p_container: string,
+  p_retailprice: double,
+  p_comment: string
+}
+
+create type PartSuppType as closed {
+  ps_partkey: int32, 
+  ps_suppkey: int32,
+  ps_availqty: int32,
+  ps_supplycost: double,
+  ps_comment: string 
+}
+
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+write output to nc1:"/tmp/join-super-key_01.adm";
+
+create dataset LineItems(LineItemType)
+  partitioned by key l_partkey, l_linenumber on group1;
+create dataset PartSupp(PartSuppType)
+  partitioned by key ps_partkey, ps_suppkey on group1;  
+
+
+for $li in dataset('LineItems')
+for $ps in dataset('PartSupp')
+where $li.l_partkey = $ps.ps_partkey and $li.l_suppkey = $ps.ps_suppkey and 
+      $li.l_extendedprice = $ps.ps_supplycost
+return {
+  "l_partkey": $li.l_partkey
+}
+
+
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/join-super-key_02.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/join-super-key_02.aql
new file mode 100644
index 0000000..0904f37
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/join-super-key_02.aql
@@ -0,0 +1,80 @@
+drop dataverse join-super-key_01 if exists;
+
+create dataverse join-super-key_01;
+
+use dataverse join-super-key_01;
+
+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 LineItemType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32, 
+  l_linenumber: int32, 
+  l_quantity: double, 
+  l_extendedprice: double,
+  l_discount: double, 
+  l_tax: double,
+  l_returnflag: string, 
+  l_linestatus: string, 
+  l_shipdate: string,
+  l_commitdate: string, 
+  l_receiptdate: string, 
+  l_shipinstruct: string, 
+  l_shipmode: string, 
+  l_comment: string
+}
+
+create type PartType as closed {
+  p_partkey: int32, 
+  p_name: string, 
+  p_mfgr: string,
+  p_brand: string,
+  p_type: string,
+  p_size: int32,
+  p_container: string,
+  p_retailprice: double,
+  p_comment: string
+}
+
+create type PartSuppType as closed {
+  ps_partkey: int32, 
+  ps_suppkey: int32,
+  ps_availqty: int32,
+  ps_supplycost: double,
+  ps_comment: string 
+}
+
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+write output to nc1:"/tmp/join-super-key_01.adm";
+
+create dataset LineItems(LineItemType)
+  partitioned by key l_partkey, l_linenumber on group1;
+create dataset PartSupp(PartSuppType)
+  partitioned by key ps_partkey, ps_suppkey on group1;  
+
+
+for $ps in dataset('PartSupp')
+for $li in dataset('LineItems')
+where $li.l_partkey = $ps.ps_partkey and $li.l_suppkey = $ps.ps_suppkey and 
+      $li.l_extendedprice = $ps.ps_supplycost
+return {
+  "l_partkey": $li.l_partkey
+}
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/loj-super-key_01.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/loj-super-key_01.aql
new file mode 100644
index 0000000..1f43f73
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/loj-super-key_01.aql
@@ -0,0 +1,86 @@
+drop dataverse loj-super-key_01 if exists;
+
+create dataverse loj-super-key_01;
+
+use dataverse loj-super-key_01;
+
+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 LineItemType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32, 
+  l_linenumber: int32, 
+  l_quantity: double, 
+  l_extendedprice: double,
+  l_discount: double, 
+  l_tax: double,
+  l_returnflag: string, 
+  l_linestatus: string, 
+  l_shipdate: string,
+  l_commitdate: string, 
+  l_receiptdate: string, 
+  l_shipinstruct: string, 
+  l_shipmode: string, 
+  l_comment: string
+}
+
+create type PartType as closed {
+  p_partkey: int32, 
+  p_name: string, 
+  p_mfgr: string,
+  p_brand: string,
+  p_type: string,
+  p_size: int32,
+  p_container: string,
+  p_retailprice: double,
+  p_comment: string
+}
+
+create type PartSuppType as closed {
+  ps_partkey: int32, 
+  ps_suppkey: int32,
+  ps_availqty: int32,
+  ps_supplycost: double,
+  ps_comment: string 
+}
+
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+write output to nc1:"/tmp/loj-super-key_01.adm";
+
+create dataset LineItems(LineItemType)
+  partitioned by key l_partkey, l_linenumber on group1;
+create dataset PartSupp(PartSuppType)
+  partitioned by key ps_partkey, ps_suppkey on group1;  
+
+
+for $li in dataset('LineItems')
+let $partsupp := 
+   for $ps in dataset('PartSupp')
+   where $li.l_partkey = $ps.ps_partkey 
+         and $li.l_suppkey = $ps.ps_suppkey  
+         and $li.l_extendedprice = $ps.ps_supplycost
+   return $ps
+return {
+  "li": $li,
+  "partsupp": $partsupp 
+} 
+ 
+
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/loj-super-key_02.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/loj-super-key_02.aql
new file mode 100644
index 0000000..ceab193
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/loj-super-key_02.aql
@@ -0,0 +1,86 @@
+drop dataverse loj-super-key_02 if exists;
+
+create dataverse loj-super-key_02;
+
+use dataverse loj-super-key_02;
+
+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 LineItemType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32, 
+  l_linenumber: int32, 
+  l_quantity: double, 
+  l_extendedprice: double,
+  l_discount: double, 
+  l_tax: double,
+  l_returnflag: string, 
+  l_linestatus: string, 
+  l_shipdate: string,
+  l_commitdate: string, 
+  l_receiptdate: string, 
+  l_shipinstruct: string, 
+  l_shipmode: string, 
+  l_comment: string
+}
+
+create type PartType as closed {
+  p_partkey: int32, 
+  p_name: string, 
+  p_mfgr: string,
+  p_brand: string,
+  p_type: string,
+  p_size: int32,
+  p_container: string,
+  p_retailprice: double,
+  p_comment: string
+}
+
+create type PartSuppType as closed {
+  ps_partkey: int32, 
+  ps_suppkey: int32,
+  ps_availqty: int32,
+  ps_supplycost: double,
+  ps_comment: string 
+}
+
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+write output to nc1:"/tmp/loj-super-key_01.adm";
+
+create dataset LineItems(LineItemType)
+  partitioned by key l_partkey, l_linenumber on group1;
+create dataset PartSupp(PartSuppType)
+  partitioned by key ps_partkey, ps_suppkey on group1;  
+
+
+for $ps in dataset('PartSupp')
+let $items := 
+   for $li in dataset('LineItems')   
+   where $li.l_partkey = $ps.ps_partkey 
+         and $li.l_suppkey = $ps.ps_suppkey  
+         and $li.l_extendedprice = $ps.ps_supplycost
+   return $li
+return {
+  "partsupp": $ps,
+  "li": $items 
+} 
+ 
+
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/nested_loj2.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/nested_loj2.aql
new file mode 100644
index 0000000..0b77f55
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/nested_loj2.aql
@@ -0,0 +1,73 @@
+drop dataverse tpch if exists;
+create dataverse tpch;
+use dataverse tpch;
+
+create type LineItemType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32, 
+  l_linenumber: int32, 
+  l_quantity: double, 
+  l_extendedprice: double,
+  l_discount: double, 
+  l_tax: double,
+  l_returnflag: string, 
+  l_linestatus: string, 
+  l_shipdate: string,
+  l_commitdate: string, 
+  l_receiptdate: string, 
+  l_shipinstruct: string, 
+  l_shipmode: string, 
+  l_comment: string
+}
+
+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 nodegroup group1 if not exists on nc1, nc2;
+
+create dataset LineItems(LineItemType)
+  partitioned by key l_orderkey, l_linenumber on group1;
+create dataset Orders(OrderType)
+  partitioned by key o_orderkey on group1;
+create dataset Customers(CustomerType) 
+  partitioned by key c_custkey on group1;
+
+write output to nc1:"/tmp/nested_loj.adm";
+
+for $c in dataset('Customers')
+let $orders := 
+  for $o in dataset('Orders')
+  where $o.o_custkey = $c.c_custkey
+  let $items := 
+    for $l in dataset('LineItems')
+    where $l.l_orderkey = $o.o_orderkey
+    return $l
+  return {
+     "order": $o,
+     "items": $items
+  }  
+return {
+  "cust": $c,
+  "orders": $orders
+}  
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/nested_loj3.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/nested_loj3.aql
new file mode 100644
index 0000000..3a1ef04
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/nested_loj3.aql
@@ -0,0 +1,92 @@
+drop dataverse tpch if exists;
+create dataverse tpch;
+use dataverse tpch;
+
+create type LineItemType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32, 
+  l_linenumber: int32, 
+  l_quantity: double, 
+  l_extendedprice: double,
+  l_discount: double, 
+  l_tax: double,
+  l_returnflag: string, 
+  l_linestatus: string, 
+  l_shipdate: string,
+  l_commitdate: string, 
+  l_receiptdate: string, 
+  l_shipinstruct: string, 
+  l_shipmode: string, 
+  l_comment: string
+}
+
+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 PartSuppType as closed {
+  ps_partkey: int32, 
+  ps_suppkey: int32,
+  ps_availqty: int32,
+  ps_supplycost: double,
+  ps_comment: string 
+}
+
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset LineItems(LineItemType)
+  partitioned by key l_orderkey, l_linenumber on group1;
+create dataset Orders(OrderType)
+  partitioned by key o_orderkey on group1;
+create dataset Customers(CustomerType) 
+  partitioned by key c_custkey on group1;
+create dataset PartSupp(PartSuppType)
+  partitioned by key ps_partkey, ps_suppkey on group1;  
+
+write output to nc1:"/tmp/nested_loj.adm";
+
+for $c in dataset('Customers')
+let $orders := 
+  for $o in dataset('Orders')
+  where $o.o_custkey = $c.c_custkey
+  let $items := 
+    for $l in dataset('LineItems')
+    where $l.l_orderkey = $o.o_orderkey
+    let $partsupp := 
+      for $ps in dataset('PartSupp')
+      where $ps.ps_partkey = $l.l_partkey and $ps.ps_suppkey = $l.l_suppkey
+      return $ps     
+    return {
+        "item": $l,
+        "part_supplier": $partsupp
+    }    
+  return {
+     "order": $o,
+     "items": $items
+  }  
+return {
+  "cust": $c,
+  "orders": $orders
+}  
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/noncollocated.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/noncollocated.aql
new file mode 100644
index 0000000..3aa1855
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/noncollocated.aql
@@ -0,0 +1,35 @@
+drop dataverse colocated if exists;
+
+create dataverse colocated;
+
+use dataverse colocated;
+
+create type UserType as open {
+  uid: int32, 
+  name: string,
+  lottery_numbers: {{int32}}
+}
+
+create type VisitorType as open {
+  vid: int32, 
+  name: string,
+  lottery_numbers: {{int32}}
+}
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create nodegroup group2 if not exists on nc2;
+
+create dataset Users(UserType) 
+  partitioned by key uid on group1;
+
+create dataset Visitors(VisitorType) 
+  partitioned by key vid on group2;
+
+
+write output to nc1:"/tmp/fuzzy1.adm";
+
+for $user in dataset('Users')
+for $visitor in dataset('Visitors')
+where $user.uid = $visitor.vid
+return { "user_name" : $user.name, "visitor_name" : $visitor.name }
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/orderby-desc-using-gby.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/orderby-desc-using-gby.aql
new file mode 100644
index 0000000..682800c
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/orderby-desc-using-gby.aql
@@ -0,0 +1,35 @@
+drop dataverse gby-using-orderby-desc if exists;
+
+create dataverse gby-using-orderby-desc;
+
+use dataverse gby-using-orderby-desc;
+
+create type AddressType as closed {
+  number: int32, 
+  street: string,
+  city: string
+}
+
+create type CustomerType as closed {
+  cid: int32, 
+  name: string,
+  age: int32?,
+  address: AddressType?,
+  lastorder: {
+    oid: int32,
+    total: float
+  }
+}
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset Customers(CustomerType) 
+  partitioned by key cid on group1;
+  
+write output to nc1:"rttest/gby-using-orderby-desc.adm";
+
+for $c in dataset('Customers')
+group by $name := $c.name decor $age := $c.age with $c
+order by $name desc, $age asc
+return { "name": $name, "age": $age }
+  
\ No newline at end of file
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/orders-aggreg.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/orders-aggreg.aql
new file mode 100644
index 0000000..c2f96f6
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/orders-aggreg.aql
@@ -0,0 +1,27 @@
+drop dataverse orders-aggreg if exists;
+
+create dataverse orders-aggreg;
+
+use dataverse orders-aggreg;
+
+create type OrderType as closed {
+  oid: int32,
+  cid: int32,
+  orderstatus: string,
+  orderpriority: string,
+  clerk: string,
+  total: float
+}
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset Orders(OrderType)
+  partitioned by key oid on group1;
+
+write output to nc1:"/tmp/orders-aggreg.adm";
+
+for $o in dataset('Orders')
+group by $cid := $o.cid with $o
+return { "cid": $cid , "ordpercust": count($o),  
+         "totalcust": sum(for $i in $o return $i.total), 
+         "avgcust": avg(for $i in $o return $i.total) } 
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/orders-index-search-conjunctive_01.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/orders-index-search-conjunctive_01.aql
new file mode 100644
index 0000000..f5b5067
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/orders-index-search-conjunctive_01.aql
@@ -0,0 +1,40 @@
+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 nodegroup group1 if not exists on nc1, nc2;
+
+create dataset Orders(OrderType)
+  partitioned by key o_orderkey on group1;
+
+load dataset Orders 
+using "edu.uci.ics.asterix.external.dataset.adapter.NCFileSystemAdapter"
+(("path"="nc1:///data/tpch0.001/orders.tbl"),("format"="delimited-text"),("delimiter"="|")) pre-sorted;
+
+create index idx_Orders_Custkey on Orders(o_custkey);
+
+write output to nc1:"/tmp/index_search-conjunctive.adm";
+
+
+for $o in dataset('Orders')
+where
+  $o.o_custkey = 40 and $o.o_totalprice > 150000.0
+order by $o.o_orderkey
+return {  
+  "o_orderkey": $o.o_orderkey,
+  "o_custkey": $o.o_custkey
+}
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/orders-index-search-conjunctive_02.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/orders-index-search-conjunctive_02.aql
new file mode 100644
index 0000000..fed390c
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/orders-index-search-conjunctive_02.aql
@@ -0,0 +1,41 @@
+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 nodegroup group1 if not exists on nc1, nc2;
+
+create dataset Orders(OrderType)
+  partitioned by key o_orderkey on group1;
+
+load dataset Orders 
+using "edu.uci.ics.asterix.external.dataset.adapter.NCFileSystemAdapter"
+(("path"="nc1://data/tpch0.001/orders.tbl"),("format"="delimited-text"),("delimiter"="|")) pre-sorted;
+
+create index idx_Orders_Custkey on Orders(o_custkey);
+
+write output to nc1:"/tmp/index_search-conjunctive.adm";
+
+
+for $o in dataset('Orders')
+where
+  $o.o_custkey = 40 and $o.o_totalprice > 150000.0
+order by $o.o_orderkey
+return {  
+  "o_orderkey": $o.o_orderkey,
+  "o_custkey": $o.o_custkey,
+  "o_totalprice": $o.o_totalprice
+}
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/orders-index-search.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/orders-index-search.aql
new file mode 100644
index 0000000..75be90b
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/orders-index-search.aql
@@ -0,0 +1,35 @@
+drop dataverse index_search if exists;
+
+create dataverse index_search;
+
+use dataverse index_search;
+
+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 nodegroup group1 if not exists on nc1, nc2;
+
+create dataset Orders(OrderType)
+  partitioned by key o_orderkey on group1;
+
+create index idx_Orders_Custkey on Orders(o_custkey);
+
+write output to nc1:"/tmp/index_search.adm";
+
+for $o in dataset('Orders')
+where
+  $o.o_custkey = 40
+return {  
+  "o_orderkey": $o.o_orderkey,
+  "o_custkey": $o.o_custkey 
+}
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/prim-idx-search.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/prim-idx-search.aql
new file mode 100644
index 0000000..7a22597
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/prim-idx-search.aql
@@ -0,0 +1,36 @@
+drop dataverse prim_index_search if exists;
+
+create dataverse prim_index_search;
+
+use dataverse prim_index_search;
+
+
+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 nodegroup group1 if not exists on nc1, nc2;
+
+create dataset Orders(OrderType)
+  partitioned by key o_orderkey on group1;
+
+
+write output to nc1:"/tmp/prim_index_search.adm";
+
+
+for $o in dataset('Orders')
+where
+  $o.o_orderkey = 34
+return {  
+  "o_orderkey": $o.o_orderkey,
+  "o_custkey": $o.o_custkey 
+}
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/pull_select_above_eq_join.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/pull_select_above_eq_join.aql
new file mode 100644
index 0000000..dfc05ff
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/pull_select_above_eq_join.aql
@@ -0,0 +1,36 @@
+drop dataverse pull-select-above-eq-join if exists;
+
+create dataverse pull-select-above-eq-join;
+
+use dataverse pull-select-above-eq-join;
+
+create type UserType as open {
+  uid: int32, 
+  name: string,
+  city: string,
+  lottery_numbers: {{int32}}
+}
+
+create type VisitorType as open {
+  vid: int32, 
+  name: string,
+  city: string,
+  lottery_numbers: {{int32}}
+}
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset Users(UserType) 
+  partitioned by key uid on group1;
+
+create dataset Visitors(VisitorType) 
+  partitioned by key vid on group1;
+
+
+write output to nc1:"/tmp/pull-select-above-eq-join.adm";
+
+for $user in dataset('Users')
+for $visitor in dataset('Visitors')
+where $user.name = $visitor.name
+      and $user.city != $visitor.city
+return {"uid": $user.uid, "vid": $visitor.vid}
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/push-project-through-group.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/push-project-through-group.aql
new file mode 100644
index 0000000..5dd229b
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/push-project-through-group.aql
@@ -0,0 +1,28 @@
+drop dataverse fuzzyjoin_080 if exists;
+
+create dataverse fuzzyjoin_080;
+
+use dataverse fuzzyjoin_080;
+
+create type DBLPType as open {
+  id: int32, 
+  dblpid: string,
+  title: string,
+  authors: string,
+  misc: string
+}
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset DBLP(DBLPType) 
+  partitioned by key id on group1;
+
+
+write output to nc1:'rttest/fuzzyjoin_080.adm';
+
+    for $paperDBLP in dataset('DBLP')
+    let $matches :=
+            for $paper in dataset('DBLP')
+            where $paper.authors = $paperDBLP.authors        
+            return $paper.title
+    return {'id': $paperDBLP.id, 'matches':$matches}
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/push_limit.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/push_limit.aql
new file mode 100644
index 0000000..a9c4fe7
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/push_limit.aql
@@ -0,0 +1,28 @@
+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 nodegroup group1 if not exists on nc1, nc2;
+create dataset Orders(OrderType)
+  partitioned by key o_orderkey on group1;
+
+write output to nc1:"/tmp/push_limit.adm";
+
+for $o in dataset('Orders')
+where $o.o_totalprice > 100
+order by $o.o_orderkey
+limit 10 offset 5
+return { "price": $o.o_totalprice, "date": $o.o_orderdate }
+
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/q1.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/q1.aql
new file mode 100644
index 0000000..8f62292
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/q1.aql
@@ -0,0 +1,37 @@
+drop dataverse events if exists;
+create dataverse events;
+use dataverse events;
+
+
+create type AddressType as closed {
+  street: string,
+  city: string,
+  zip: string,
+  latlong: point
+}
+
+create type UserType as open {
+  name: string,
+  email: string,
+  interests: {{string}},
+  address: AddressType,
+  member_of: {{
+    {
+      sig_name: string,
+      chapter_name: string,
+      member_since: date
+    }
+  }}
+}
+
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset User(UserType) partitioned by key name on group1;
+
+write output to nc1:"/tmp/q1.adm";
+
+for $user in dataset('User')
+where some $i in $user.interests
+  satisfies $i = "movies"
+return {"name": $user.name}
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/q2.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/q2.aql
new file mode 100644
index 0000000..17b1f86
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/q2.aql
@@ -0,0 +1,52 @@
+drop dataverse events if exists;
+create dataverse events;
+use dataverse events;
+
+
+create type AddressType as closed {
+  street: string,
+  city: string,
+  zip: string
+ //, latlong: point
+}
+
+create type EventType as closed {
+  name: string,
+  location: AddressType	?,
+  organizers: {{ 
+   {
+     name: string,
+     role: string
+   }
+  }},
+  sponsoring_sigs: [
+    {
+      sig_name: string,
+      chapter_name: string
+    }
+  ],
+  interest_keywords: {{string}},
+  price: double?,
+  start_time: datetime,
+  end_time: datetime
+}
+
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset Event(EventType) partitioned by key name on group1;
+
+write output to nc1:"/tmp/q2.adm";
+
+for $event in dataset('Event')
+for $sponsor in $event.sponsoring_sigs
+let $es := { "event": $event, "sponsor": $sponsor }
+group by $sig_name := $sponsor.sig_name with $es
+let $sig_sponsorship_count := count($es)
+let $by_chapter :=
+   for $e in $es
+   group by $chapter_name := $e.sponsor.chapter_name with $e
+   return { "chapter_name": $chapter_name, "escount" : count($e) }
+order by $sig_sponsorship_count desc
+limit 5
+return { "sig_name": $sig_name, "total_count": $sig_sponsorship_count, "chapter_breakdown": $by_chapter }
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/q3_shipping_priority.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/q3_shipping_priority.aql
new file mode 100644
index 0000000..89c6fd9
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/q3_shipping_priority.aql
@@ -0,0 +1,83 @@
+drop dataverse q3_shipping_priority if exists;
+
+create dataverse q3_shipping_priority;
+
+use dataverse q3_shipping_priority;
+
+create type LineItemType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32, 
+  l_linenumber: int32, 
+  l_quantity: double, 
+  l_extendedprice: double,
+  l_discount: double, 
+  l_tax: double,
+  l_returnflag: string, 
+  l_linestatus: string, 
+  l_shipdate: string,
+  l_commitdate: string, 
+  l_receiptdate: string, 
+  l_shipinstruct: string, 
+  l_shipmode: string, 
+  l_comment: string
+}
+
+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 nodegroup group1 if not exists on nc1, nc2;
+
+create dataset LineItems(LineItemType)
+  partitioned by key l_orderkey, l_linenumber on group1;
+create dataset Orders(OrderType)
+  partitioned by key o_orderkey on group1;
+create dataset Customers(CustomerType) 
+  partitioned by key c_custkey on group1;
+
+write output to nc1:"/tmp/q3_shipping_priority.adm";
+
+for $c in dataset('Customers')
+for $o in dataset('Orders')
+where
+  $c.c_mktsegment = 'BUILDING' and $c.c_custkey = $o.o_custkey 
+for $l in dataset('LineItems')
+where
+  $l.l_orderkey = $o.o_orderkey and
+  $o.o_orderdate < '1995-03-15' and $l.l_shipdate > '1995-03-15'
+  /*+ hash */
+group by $l_orderkey := $l.l_orderkey, $o_orderdate := $o.o_orderdate, $o_shippriority := $o.o_shippriority
+  with $l
+let $revenue := sum (
+  for $i in $l 
+  return 
+    $i.l_extendedprice * (1 - $i.l_discount)
+)
+order by $revenue desc, $o_orderdate
+limit 10
+return {  
+  "l_orderkey": $l_orderkey,
+  "revenue": $revenue,
+  "o_orderdate": $o_orderdate,
+  "o_shippriority": $o_shippriority 
+}
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/q5_local_supplier_volume.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/q5_local_supplier_volume.aql
new file mode 100644
index 0000000..6b5ccfa
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/q5_local_supplier_volume.aql
@@ -0,0 +1,122 @@
+drop dataverse q5_local_supplier if exists;
+
+create dataverse q5_local_supplier;
+
+use dataverse q5_local_supplier;
+
+create type LineItemType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32, 
+  l_linenumber: int32, 
+  l_quantity: double, 
+  l_extendedprice: double,
+  l_discount: double, 
+  l_tax: double,
+  l_returnflag: string, 
+  l_linestatus: string, 
+  l_shipdate: string,
+  l_commitdate: string, 
+  l_receiptdate: string, 
+  l_shipinstruct: string, 
+  l_shipmode: string, 
+  l_comment: string
+}
+
+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 nodegroup group1 if not exists on nc1, nc2;
+
+create dataset LineItems(LineItemType)
+  partitioned by key l_orderkey, l_linenumber on group1;
+create dataset Orders(OrderType)
+  partitioned by key o_orderkey on group1;
+create dataset Customers(CustomerType) 
+  partitioned by key c_custkey on group1;
+create dataset Suppliers(SupplierType)
+  partitioned by key s_suppkey on group1;
+create dataset Nations(NationType) 
+  partitioned by key n_nationkey on group1;
+create dataset Regions(RegionType)
+  partitioned by key r_regionkey on group1;
+  
+write output to nc1:"/tmp/q5_local_supplier.adm";
+
+
+for $c in dataset('Customers')
+for $o1 in 
+(  for $o in dataset('Orders')
+   for $l1 in (
+     for $l in dataset('LineItems')
+     for $s1 in 
+     (  for $s in dataset('Suppliers')
+        for $n1 in 
+        (  for $n in dataset('Nations')
+           for $r in dataset('Regions')
+             where $n.n_regionkey = $r.r_regionkey and $r.r_name = 'ASIA'
+           return 
+              {"n_name": $n.n_name, "n_nationkey": $n.n_nationkey}  )
+        where $s.s_nationkey = $n1.n_nationkey
+        return 
+           { "n_name": $n1.n_name, "s_suppkey": $s.s_suppkey, "s_nationkey": $s.s_nationkey }  )
+     where $l.l_suppkey = $s1.s_suppkey      
+     return 
+        { "n_name": $s1.n_name, "l_extendedprice": $l.l_extendedprice, "l_discount": $l.l_discount, "l_orderkey": $l.l_orderkey, "s_nationkey": $s1.s_nationkey }  )
+   where $l1.l_orderkey = $o.o_orderkey and $o.o_orderdate >= '1994-01-01' and $o.o_orderdate < '1995-01-01'
+   return 
+     { "n_name": $l1.n_name, "l_extendedprice": $l1.l_extendedprice, "l_discount": $l1.l_discount, "s_nationkey": $l1.s_nationkey, "o_custkey": $o.o_custkey }  )
+where $c.c_nationkey = $o1.s_nationkey and $c.c_custkey = $o1.o_custkey     
+/*+ hash*/
+group by $n_name := $o1.n_name with $o1
+let $revenue := sum (
+  for $i in $o1 
+  return 
+    $i.l_extendedprice * (1 - $i.l_discount)
+)
+order by $revenue desc
+return 
+  { "n_name": $n_name, "revenue": $revenue }
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/record_access.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/record_access.aql
new file mode 100644
index 0000000..f69f28c
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/record_access.aql
@@ -0,0 +1,9 @@
+drop dataverse test if exists;
+create dataverse test;
+use dataverse test;
+
+write output to nc1:"/tmp/rec_access.adm";
+
+let $r := { "a": 2 }
+let $a := $r.a
+return $a
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/rtree-secondary-index.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/rtree-secondary-index.aql
new file mode 100644
index 0000000..d525458
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/rtree-secondary-index.aql
@@ -0,0 +1,32 @@
+drop dataverse test if exists;
+create dataverse test;
+use dataverse test;
+
+create type MyRecord as closed {
+  id: int32,
+  point: point,
+  kwds: string,
+  line1: line,
+  line2: line,
+  poly1: polygon,
+  poly2: polygon,
+  rec: rectangle
+}
+
+create nodegroup group1  if not exists on nc1, nc2;
+
+create dataset MyData(MyRecord)
+  partitioned by key id on group1;
+
+load dataset MyData 
+using "edu.uci.ics.asterix.external.dataset.adapter.NCFileSystemAdapter"
+(("path"="nc1://data/spatial/spatialData.json"),("format"="adm")) pre-sorted;
+
+create index rtree_index_point on MyData(point) type rtree;
+
+
+write output to nc1:"rttest/index_rtree-secondary-index.adm";
+
+for $o in dataset('MyData')
+where spatial-intersect($o.point, create-polygon(create-point(4.0,1.0), create-point(4.0,4.0), create-point(12.0,4.0), create-point(12.0,1.0)))
+return {"id":$o.id}
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/scan-delete-all.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/scan-delete-all.aql
new file mode 100644
index 0000000..d30b7f8
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/scan-delete-all.aql
@@ -0,0 +1,38 @@
+drop dataverse tpch if exists;
+create dataverse tpch;
+use dataverse tpch;
+
+create type LineItemType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32, 
+  l_linenumber: int32, 
+  l_quantity: double, 
+  l_extendedprice: double,
+  l_discount: double, 
+  l_tax: double,
+  l_returnflag: string, 
+  l_linestatus: string, 
+  l_shipdate: string,
+  l_commitdate: string, 
+  l_receiptdate: string, 
+  l_shipinstruct: string, 
+  l_shipmode: string, 
+  l_comment: string
+}
+
+create type LineIDType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32
+}
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset LineItems_q1(LineItemType)
+  partitioned by key l_orderkey on group1;
+
+create dataset LineID(LineIDType)
+  partitioned by key l_orderkey on group1;
+
+delete $l from dataset LineItems_q1;
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/scan-delete-rtree-secondary-index.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/scan-delete-rtree-secondary-index.aql
new file mode 100644
index 0000000..5f1e8d3
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/scan-delete-rtree-secondary-index.aql
@@ -0,0 +1,27 @@
+drop dataverse test if exists;
+create dataverse test;
+use dataverse test;
+
+create type MyRecord as closed {
+  id: int32,
+  point: point,
+  kwds: string,
+  line1: line,
+  line2: line,
+  poly1: polygon,
+  poly2: polygon,
+  rec: rectangle
+}
+
+create nodegroup group1  if not exists on nc1, nc2;
+
+create dataset MyData(MyRecord)
+  partitioned by key id on group1;
+
+load dataset MyData 
+using "edu.uci.ics.asterix.external.dataset.adapter.NCFileSystemAdapter"
+(("path"="nc1://data/spatial/spatialData.json"),("format"="adm")) pre-sorted;
+
+create index rtree_index_point on MyData(point) type rtree;
+
+delete $m from dataset MyData where $m.id>5;
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/scan-delete.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/scan-delete.aql
new file mode 100644
index 0000000..9bf6a4c
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/scan-delete.aql
@@ -0,0 +1,39 @@
+drop dataverse tpch if exists;
+create dataverse tpch;
+use dataverse tpch;
+
+create type LineItemType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32, 
+  l_linenumber: int32, 
+  l_quantity: double, 
+  l_extendedprice: double,
+  l_discount: double, 
+  l_tax: double,
+  l_returnflag: string, 
+  l_linestatus: string, 
+  l_shipdate: string,
+  l_commitdate: string, 
+  l_receiptdate: string, 
+  l_shipinstruct: string, 
+  l_shipmode: string, 
+  l_comment: string
+}
+
+
+create type LineIDType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32
+}
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset LineItems_q1(LineItemType)
+  partitioned by key l_orderkey on group1;
+
+create dataset LineID(LineIDType)
+  partitioned by key l_orderkey on group1;
+
+delete $l from dataset LineItems_q1 where $l.l_shipdate <= '1998-09-02';
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/scan-insert-secondary-index.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/scan-insert-secondary-index.aql
new file mode 100644
index 0000000..afecc04
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/scan-insert-secondary-index.aql
@@ -0,0 +1,49 @@
+drop dataverse tpch if exists;
+create dataverse tpch;
+use dataverse tpch;
+
+create type LineItemType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32, 
+  l_linenumber: int32, 
+  l_quantity: double, 
+  l_extendedprice: double,
+  l_discount: double, 
+  l_tax: double,
+  l_returnflag: string, 
+  l_linestatus: string, 
+  l_shipdate: string,
+  l_commitdate: string, 
+  l_receiptdate: string, 
+  l_shipinstruct: string, 
+  l_shipmode: string, 
+  l_comment: string
+}
+
+create type LineIDType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32
+}
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset LineItems_q1(LineItemType)
+  partitioned by key l_orderkey on group1;
+
+create dataset LineID(LineIDType)
+  partitioned by key l_orderkey on group1;
+  
+create index idx_LineID_partkey on LineID(l_partkey);
+create index idx_LineID_suppkey on LineID(l_suppkey);
+
+insert into dataset LineID (
+for $l in dataset('LineItems_q1')
+//	where $l.l_shipdate <= '1998-09-02'
+	return {
+		"l_orderkey": $l.l_orderkey,
+		"l_partkey": $l.l_partkey,
+		"l_suppkey": $l.l_partkey
+	}
+);
\ No newline at end of file
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/scan-insert.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/scan-insert.aql
new file mode 100644
index 0000000..beb73a7
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/scan-insert.aql
@@ -0,0 +1,46 @@
+drop dataverse tpch if exists;
+create dataverse tpch;
+use dataverse tpch;
+
+create type LineItemType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32, 
+  l_linenumber: int32, 
+  l_quantity: double, 
+  l_extendedprice: double,
+  l_discount: double, 
+  l_tax: double,
+  l_returnflag: string, 
+  l_linestatus: string, 
+  l_shipdate: string,
+  l_commitdate: string, 
+  l_receiptdate: string, 
+  l_shipinstruct: string, 
+  l_shipmode: string, 
+  l_comment: string
+}
+
+create type LineIDType as closed {
+  l_orderkey: int32, 
+  l_partkey: int32, 
+  l_suppkey: int32
+}
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset LineItems_q1(LineItemType)
+  partitioned by key l_orderkey on group1;
+
+create dataset LineID(LineIDType)
+  partitioned by key l_orderkey on group1;
+
+insert into dataset LineID (
+for $l in dataset('LineItems_q1')
+//	where $l.l_shipdate <= '1998-09-02'
+	return {
+		"l_orderkey": $l.l_orderkey,
+		"l_partkey": $l.l_partkey,
+		"l_suppkey": $l.l_partkey
+	}
+);
\ No newline at end of file
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/sort-cust.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/sort-cust.aql
new file mode 100644
index 0000000..ec4f6f1
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/sort-cust.aql
@@ -0,0 +1,37 @@
+drop dataverse custlimit if exists;
+
+create dataverse custlimit;
+
+use dataverse custlimit;
+
+create type AddressType as closed {
+  number: int32,
+  street: string,
+  city: string
+}
+
+create type CustomerType as closed {
+  cid: int32,
+  name: string,
+  age: int32?,
+  address: AddressType?,
+  lastorder: {
+    oid: int32,
+    total: float
+  }
+}
+
+
+
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset Customers(CustomerType)
+  partitioned by key cid on group1;
+
+write output to nc1:"/tmp/custlimit.adm";
+
+for $c in dataset('Customers')
+order by $c.age
+limit 10 // offset 10000
+return {"custname":$c.name, "custage":$c.age}
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/queries/unnest_list_in_subplan.aql b/asterix/asterix-app/src/test/resources/optimizerts/queries/unnest_list_in_subplan.aql
new file mode 100644
index 0000000..5a943f1
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/queries/unnest_list_in_subplan.aql
@@ -0,0 +1,37 @@
+drop dataverse fuzzyjoin if exists;
+create dataverse fuzzyjoin;
+use dataverse fuzzyjoin;
+
+create type DBLPType as closed {
+  id: int32, 
+  dblpid: string,
+  title: string,
+  authors: string,
+  misc: string
+}
+
+create type TOKENSRANKEDADMType as closed {
+  token: int32,
+  rank: int32
+}
+
+create nodegroup group1 if not exists on nc1, nc2;
+
+create dataset DBLP(DBLPType) partitioned by key id on group1;
+create dataset TOKENSRANKEDADM(TOKENSRANKEDADMType) partitioned by key rank on group1;
+
+write output to nc1:'rttest/unnest_list_in_subplan.adm';
+
+    //
+    // -- - Stage 2 - --
+    //
+    for $paperDBLP in dataset('DBLP')
+    let $idDBLP := $paperDBLP.id
+    let $tokensUnrankedDBLP := counthashed-word-tokens($paperDBLP.title)
+    let $tokensDBLP :=
+        for $tokenUnranked in $tokensUnrankedDBLP
+        for $tokenRanked in dataset('TOKENSRANKEDADM')
+        where $tokenUnranked = $tokenRanked.token
+        order by $tokenRanked.rank
+        return $tokenRanked.rank
+    return {'id': $idDBLP, 'tokens': $tokensDBLP}
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/const-folding.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/const-folding.plan
new file mode 100644
index 0000000..70e2daa
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/const-folding.plan
@@ -0,0 +1,4 @@
+-- SINK_WRITE  |UNPARTITIONED|
+  -- STREAM_PROJECT  |UNPARTITIONED|
+    -- ASSIGN  |UNPARTITIONED|
+      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/count-tweets.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/count-tweets.plan
new file mode 100644
index 0000000..4f1d53f
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/count-tweets.plan
@@ -0,0 +1,27 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$14]  |PARTITIONED|
+                  {
+                    -- AGGREGATE  |LOCAL|
+                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                  }
+            -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$14(ASC)] HASH:[$$14]  |PARTITIONED|
+              -- PRE_CLUSTERED_GROUP_BY[$$4]  |LOCAL|
+                      {
+                        -- AGGREGATE  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                      }
+                -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                  -- STABLE_SORT [$$4(ASC)]  |LOCAL|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- STREAM_PROJECT  |PARTITIONED|
+                        -- UNNEST  |PARTITIONED|
+                          -- ASSIGN  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/cust_group_no_agg.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/cust_group_no_agg.plan
new file mode 100644
index 0000000..6559478
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/cust_group_no_agg.plan
@@ -0,0 +1,18 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- SORT_MERGE_EXCHANGE [$$1(ASC) ]  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+        -- PRE_CLUSTERED_GROUP_BY[$$6]  |PARTITIONED|
+                {
+                  -- AGGREGATE  |LOCAL|
+                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                }
+          -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+            -- STABLE_SORT [$$6(ASC)]  |LOCAL|
+              -- HASH_PARTITION_EXCHANGE [$$6]  |PARTITIONED|
+                -- STREAM_PROJECT  |PARTITIONED|
+                  -- ASSIGN  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- DATASOURCE_SCAN  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/denorm-cust-order.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/denorm-cust-order.plan
new file mode 100644
index 0000000..347a895
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/denorm-cust-order.plan
@@ -0,0 +1,27 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$15]  |PARTITIONED|
+                  {
+                    -- AGGREGATE  |LOCAL|
+                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                  }
+            -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+              -- STABLE_SORT [$$15(ASC)]  |LOCAL|
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$15][$$19]  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- DATASOURCE_SCAN  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$19]  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/fj-dblp-csx.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/fj-dblp-csx.plan
new file mode 100644
index 0000000..3130442
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/fj-dblp-csx.plan
@@ -0,0 +1,90 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- STREAM_PROJECT  |PARTITIONED|
+    -- ASSIGN  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$18(ASC), $$19(ASC) ]  |PARTITIONED|
+        -- PRE_CLUSTERED_GROUP_BY[$$42, $$44]  |PARTITIONED|
+                {
+                  -- AGGREGATE  |LOCAL|
+                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                }
+          -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+            -- STABLE_SORT [$$42(ASC), $$44(ASC)]  |LOCAL|
+              -- HASH_PARTITION_EXCHANGE [$$42, $$44]  |PARTITIONED|
+                -- STREAM_PROJECT  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- HYBRID_HASH_JOIN [$$8][$$17]  |PARTITIONED|
+                      -- HASH_PARTITION_EXCHANGE [$$8]  |PARTITIONED|
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          -- UNNEST  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- PRE_CLUSTERED_GROUP_BY[$$46]  |PARTITIONED|
+                                      {
+                                        -- AGGREGATE  |LOCAL|
+                                          -- STREAM_SELECT  |LOCAL|
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      }
+                                -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                                  -- STABLE_SORT [$$46(ASC), $$6(ASC)]  |LOCAL|
+                                    -- HASH_PARTITION_EXCHANGE [$$46]  |PARTITIONED|
+                                      -- STREAM_PROJECT  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- HYBRID_HASH_JOIN [$$4][$$26]  |PARTITIONED|
+                                            -- HASH_PARTITION_EXCHANGE [$$4]  |PARTITIONED|
+                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                -- UNNEST  |PARTITIONED|
+                                                  -- ASSIGN  |PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
+                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                        -- DATASOURCE_SCAN  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- STREAM_PROJECT  |UNPARTITIONED|
+                                                -- ASSIGN  |UNPARTITIONED|
+                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                    -- SPLIT  |PARTITIONED|
+                                                      -- HASH_PARTITION_EXCHANGE [$$35]  |PARTITIONED|
+                                                        -- RUNNING_AGGREGATE  |PARTITIONED|
+                                                          -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                              -- ASSIGN  |PARTITIONED|
+                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                      -- HASH_PARTITION_EXCHANGE [$$17]  |PARTITIONED|
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          -- UNNEST  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- PRE_CLUSTERED_GROUP_BY[$$47]  |PARTITIONED|
+                                      {
+                                        -- AGGREGATE  |LOCAL|
+                                          -- STREAM_SELECT  |LOCAL|
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      }
+                                -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                                  -- STABLE_SORT [$$47(ASC), $$15(ASC)]  |LOCAL|
+                                    -- HASH_PARTITION_EXCHANGE [$$47]  |PARTITIONED|
+                                      -- STREAM_PROJECT  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- HYBRID_HASH_JOIN [$$13][$$35]  |PARTITIONED|
+                                            -- HASH_PARTITION_EXCHANGE [$$13]  |PARTITIONED|
+                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                -- UNNEST  |PARTITIONED|
+                                                  -- ASSIGN  |PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
+                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                        -- DATASOURCE_SCAN  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- SPLIT  |PARTITIONED|
+                                                -- HASH_PARTITION_EXCHANGE [$$35]  |PARTITIONED|
+                                                  -- RUNNING_AGGREGATE  |PARTITIONED|
+                                                    -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                        -- ASSIGN  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- DATASOURCE_SCAN  |PARTITIONED|
+                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/fj-phase1.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/fj-phase1.plan
new file mode 100644
index 0000000..3042fae
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/fj-phase1.plan
@@ -0,0 +1,52 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$23]  |PARTITIONED|
+                  {
+                    -- AGGREGATE  |LOCAL|
+                      -- STREAM_SELECT  |LOCAL|
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                  }
+            -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+              -- STABLE_SORT [$$23(ASC), $$7(ASC)]  |LOCAL|
+                -- HASH_PARTITION_EXCHANGE [$$23]  |PARTITIONED|
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$2][$$7]  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$2]  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- UNNEST  |PARTITIONED|
+                              -- ASSIGN  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$7]  |PARTITIONED|
+                          -- RUNNING_AGGREGATE  |PARTITIONED|
+                            -- STREAM_PROJECT  |PARTITIONED|
+                              -- SORT_MERGE_EXCHANGE [$$24(DESC) ]  |PARTITIONED|
+                                -- STABLE_SORT [$$24(DESC)]  |LOCAL|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- PRE_CLUSTERED_GROUP_BY[$$30]  |PARTITIONED|
+                                            {
+                                              -- AGGREGATE  |LOCAL|
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            }
+                                      -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$30(ASC)] HASH:[$$30]  |PARTITIONED|
+                                        -- PRE_CLUSTERED_GROUP_BY[$$6]  |LOCAL|
+                                                {
+                                                  -- AGGREGATE  |LOCAL|
+                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                }
+                                          -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                                            -- STABLE_SORT [$$6(ASC)]  |LOCAL|
+                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                -- STREAM_PROJECT  |PARTITIONED|
+                                                  -- UNNEST  |PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
+                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                        -- DATASOURCE_SCAN  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/fj-phase2-with-hints.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/fj-phase2-with-hints.plan
new file mode 100644
index 0000000..bac7a04
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/fj-phase2-with-hints.plan
@@ -0,0 +1,53 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- STREAM_PROJECT  |PARTITIONED|
+    -- ASSIGN  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$31(ASC) ]  |PARTITIONED|
+        -- STABLE_SORT [$$31(ASC)]  |LOCAL|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            -- STREAM_PROJECT  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- PRE_CLUSTERED_GROUP_BY[$$27]  |PARTITIONED|
+                        {
+                          -- AGGREGATE  |LOCAL|
+                            -- IN_MEMORY_STABLE_SORT [$$5(ASC)]  |LOCAL|
+                              -- STREAM_SELECT  |LOCAL|
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        }
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- STREAM_PROJECT  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- IN_MEMORY_HASH_JOIN [$$3][$$8]  |PARTITIONED|
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            -- STREAM_PROJECT  |PARTITIONED|
+                              -- UNNEST  |PARTITIONED|
+                                -- ASSIGN  |PARTITIONED|
+                                  -- ASSIGN  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- DATASOURCE_SCAN  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                          -- BROADCAST_EXCHANGE  |PARTITIONED|
+                            -- RUNNING_AGGREGATE  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- SORT_MERGE_EXCHANGE [$$28(ASC), $$8(ASC) ]  |PARTITIONED|
+                                  -- STABLE_SORT [$$28(ASC), $$8(ASC)]  |LOCAL|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- EXTERNAL_GROUP_BY[$$36]  |PARTITIONED|
+                                              {
+                                                -- AGGREGATE  |LOCAL|
+                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              }
+                                        -- HASH_PARTITION_EXCHANGE [$$36]  |PARTITIONED|
+                                          -- EXTERNAL_GROUP_BY[$$7]  |LOCAL|
+                                                  {
+                                                    -- AGGREGATE  |LOCAL|
+                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                  }
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                -- UNNEST  |PARTITIONED|
+                                                  -- ASSIGN  |PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                      -- DATASOURCE_SCAN  |PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/inline-funs.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/inline-funs.plan
new file mode 100644
index 0000000..70e2daa
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/inline-funs.plan
@@ -0,0 +1,4 @@
+-- SINK_WRITE  |UNPARTITIONED|
+  -- STREAM_PROJECT  |UNPARTITIONED|
+    -- ASSIGN  |UNPARTITIONED|
+      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/inlined_q18_large_volume_customer.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/inlined_q18_large_volume_customer.plan
new file mode 100644
index 0000000..81b10a9
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/inlined_q18_large_volume_customer.plan
@@ -0,0 +1,84 @@
+-- SINK_WRITE  |UNPARTITIONED|
+  -- STREAM_PROJECT  |UNPARTITIONED|
+    -- ASSIGN  |UNPARTITIONED|
+      -- STREAM_LIMIT  |UNPARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$12(DESC), $$11(ASC) ]  |PARTITIONED|
+          -- STREAM_LIMIT  |LOCAL|
+            -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+              -- STABLE_SORT [$$12(DESC), $$11(ASC)]  |LOCAL|
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  -- PRE_CLUSTERED_GROUP_BY[$$73, $$74]  |PARTITIONED|
+                          {
+                            -- AGGREGATE  |LOCAL|
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          }
+                    -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$73(ASC), $$74(ASC)] HASH:[$$73, $$74]  |PARTITIONED|
+                      -- PRE_CLUSTERED_GROUP_BY[$$54, $$55]  |LOCAL|
+                              {
+                                -- AGGREGATE  |LOCAL|
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              }
+                        -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                          -- STABLE_SORT [$$54(ASC), $$55(ASC)]  |LOCAL|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- HYBRID_HASH_JOIN [$$55][$$58]  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- STREAM_PROJECT  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- HYBRID_HASH_JOIN [$$55][$$4]  |PARTITIONED|
+                                            -- HASH_PARTITION_EXCHANGE [$$55]  |PARTITIONED|
+                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                  -- HYBRID_HASH_JOIN [$$54][$$63]  |PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                        -- ASSIGN  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- DATASOURCE_SCAN  |PARTITIONED|
+                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                    -- HASH_PARTITION_EXCHANGE [$$63]  |PARTITIONED|
+                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                        -- ASSIGN  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- DATASOURCE_SCAN  |PARTITIONED|
+                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                            -- HASH_PARTITION_EXCHANGE [$$4]  |PARTITIONED|
+                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                -- STREAM_SELECT  |PARTITIONED|
+                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                    -- PRE_CLUSTERED_GROUP_BY[$$70]  |PARTITIONED|
+                                                            {
+                                                              -- AGGREGATE  |LOCAL|
+                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                            }
+                                                      -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$70(ASC)] HASH:[$$70]  |PARTITIONED|
+                                                        -- PRE_CLUSTERED_GROUP_BY[$$56]  |LOCAL|
+                                                                {
+                                                                  -- AGGREGATE  |LOCAL|
+                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                }
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- SPLIT  |PARTITIONED|
+                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- STREAM_PROJECT  |PARTITIONED|
+                                                                  -- ASSIGN  |PARTITIONED|
+                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                    -- HASH_PARTITION_EXCHANGE [$$58]  |PARTITIONED|
+                                      -- STREAM_PROJECT  |UNPARTITIONED|
+                                        -- ASSIGN  |UNPARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- SPLIT  |PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                -- STREAM_PROJECT  |PARTITIONED|
+                                                  -- ASSIGN  |PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                      -- DATASOURCE_SCAN  |PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/introhashpartitionmerge.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/introhashpartitionmerge.plan
new file mode 100644
index 0000000..097c0df
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/introhashpartitionmerge.plan
@@ -0,0 +1,21 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- SORT_MERGE_EXCHANGE [$$13(ASC) ]  |PARTITIONED|
+    -- STABLE_SORT [$$13(ASC)]  |LOCAL|
+      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            -- HYBRID_HASH_JOIN [$$15][$$16]  |PARTITIONED|
+              -- HASH_PARTITION_EXCHANGE [$$15]  |PARTITIONED|
+                -- STREAM_PROJECT  |PARTITIONED|
+                  -- ASSIGN  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- DATASOURCE_SCAN  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+              -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$13(ASC)] HASH:[$$16]  |PARTITIONED|
+                -- STREAM_PROJECT  |PARTITIONED|
+                  -- ASSIGN  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- DATASOURCE_SCAN  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/join-super-key_01.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/join-super-key_01.plan
new file mode 100644
index 0000000..ac5a3a8
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/join-super-key_01.plan
@@ -0,0 +1,20 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- HYBRID_HASH_JOIN [$$20, $$22, $$16][$$19, $$23, $$18]  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$16, $$20, $$22]  |PARTITIONED|
+              -- STREAM_PROJECT  |PARTITIONED|
+                -- ASSIGN  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- DATASOURCE_SCAN  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$19, $$18, $$23]  |PARTITIONED|
+              -- STREAM_PROJECT  |PARTITIONED|
+                -- ASSIGN  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- DATASOURCE_SCAN  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/join-super-key_02.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/join-super-key_02.plan
new file mode 100644
index 0000000..eb5e8c8
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/join-super-key_02.plan
@@ -0,0 +1,20 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- HYBRID_HASH_JOIN [$$17, $$23, $$16][$$20, $$22, $$18]  |PARTITIONED|
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+              -- STREAM_PROJECT  |PARTITIONED|
+                -- ASSIGN  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- DATASOURCE_SCAN  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$18, $$20]  |PARTITIONED|
+              -- STREAM_PROJECT  |PARTITIONED|
+                -- ASSIGN  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- DATASOURCE_SCAN  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/loj-super-key_01.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/loj-super-key_01.plan
new file mode 100644
index 0000000..69d63d5
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/loj-super-key_01.plan
@@ -0,0 +1,29 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$22, $$23]  |PARTITIONED|
+                  {
+                    -- AGGREGATE  |LOCAL|
+                      -- STREAM_SELECT  |LOCAL|
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                  }
+            -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+              -- STABLE_SORT [$$22(ASC), $$23(ASC)]  |LOCAL|
+                -- HASH_PARTITION_EXCHANGE [$$23, $$22]  |PARTITIONED|
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$24, $$22, $$28][$$25, $$19, $$20]  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$22, $$24, $$28]  |PARTITIONED|
+                          -- ASSIGN  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- DATASOURCE_SCAN  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$19, $$20, $$25]  |PARTITIONED|
+                          -- ASSIGN  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- DATASOURCE_SCAN  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/loj-super-key_02.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/loj-super-key_02.plan
new file mode 100644
index 0000000..7b0bf69
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/loj-super-key_02.plan
@@ -0,0 +1,30 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$22, $$23]  |PARTITIONED|
+                  {
+                    -- AGGREGATE  |LOCAL|
+                      -- STREAM_SELECT  |LOCAL|
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                  }
+            -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+              -- STABLE_SORT [$$22(ASC), $$23(ASC)]  |LOCAL|
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$25, $$22, $$23][$$24, $$19, $$28]  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- ASSIGN  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- DATASOURCE_SCAN  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$19, $$28]  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/nested_loj2.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/nested_loj2.plan
new file mode 100644
index 0000000..a203f14
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/nested_loj2.plan
@@ -0,0 +1,44 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$25]  |PARTITIONED|
+                  {
+                    -- AGGREGATE  |LOCAL|
+                      -- MICRO_PRE_CLUSTERED_GROUP_BY[$$23]  |LOCAL|
+                              {
+                                -- AGGREGATE  |LOCAL|
+                                  -- STREAM_SELECT  |LOCAL|
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              }
+                        -- STREAM_SELECT  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                  }
+            -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+              -- STABLE_SORT [$$25(ASC), $$23(ASC)]  |LOCAL|
+                -- HASH_PARTITION_EXCHANGE [$$25]  |PARTITIONED|
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$23][$$20]  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$23]  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- HYBRID_HASH_JOIN [$$25][$$26]  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                -- HASH_PARTITION_EXCHANGE [$$26]  |PARTITIONED|
+                                  -- ASSIGN  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- DATASOURCE_SCAN  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$20]  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/nested_loj3.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/nested_loj3.plan
new file mode 100644
index 0000000..17cae26
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/nested_loj3.plan
@@ -0,0 +1,59 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$42]  |PARTITIONED|
+                  {
+                    -- AGGREGATE  |LOCAL|
+                      -- MICRO_PRE_CLUSTERED_GROUP_BY[$$40]  |LOCAL|
+                              {
+                                -- AGGREGATE  |LOCAL|
+                                  -- MICRO_PRE_CLUSTERED_GROUP_BY[$$37, $$38]  |LOCAL|
+                                          {
+                                            -- AGGREGATE  |LOCAL|
+                                              -- STREAM_SELECT  |LOCAL|
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          }
+                                    -- IN_MEMORY_STABLE_SORT [$$37(ASC), $$38(ASC)]  |LOCAL|
+                                      -- STREAM_SELECT  |LOCAL|
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              }
+                        -- IN_MEMORY_STABLE_SORT [$$40(ASC), $$38(ASC)]  |LOCAL|
+                          -- STREAM_SELECT  |LOCAL|
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                  }
+            -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+              -- STABLE_SORT [$$42(ASC), $$40(ASC)]  |LOCAL|
+                -- HASH_PARTITION_EXCHANGE [$$42]  |PARTITIONED|
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$48, $$50][$$34, $$35]  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$50, $$48]  |PARTITIONED|
+                          -- HYBRID_HASH_JOIN [$$40][$$37]  |PARTITIONED|
+                            -- HASH_PARTITION_EXCHANGE [$$40]  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- HYBRID_HASH_JOIN [$$42][$$43]  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- DATASOURCE_SCAN  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                    -- HASH_PARTITION_EXCHANGE [$$43]  |PARTITIONED|
+                                      -- ASSIGN  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- DATASOURCE_SCAN  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                            -- HASH_PARTITION_EXCHANGE [$$37]  |PARTITIONED|
+                              -- ASSIGN  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- ASSIGN  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- DATASOURCE_SCAN  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/noncollocated.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/noncollocated.plan
new file mode 100644
index 0000000..32a0b06
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/noncollocated.plan
@@ -0,0 +1,20 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- HYBRID_HASH_JOIN [$$10][$$11]  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$10]  |PARTITIONED|
+              -- STREAM_PROJECT  |PARTITIONED|
+                -- ASSIGN  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- DATASOURCE_SCAN  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$11]  |PARTITIONED|
+              -- STREAM_PROJECT  |PARTITIONED|
+                -- ASSIGN  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- DATASOURCE_SCAN  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/orderby-desc-using-gby.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/orderby-desc-using-gby.plan
new file mode 100644
index 0000000..671187a
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/orderby-desc-using-gby.plan
@@ -0,0 +1,18 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- STREAM_PROJECT  |PARTITIONED|
+    -- ASSIGN  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$1(DESC) ]  |PARTITIONED|
+        -- PRE_CLUSTERED_GROUP_BY[$$9]  |PARTITIONED|
+                {
+                  -- AGGREGATE  |LOCAL|
+                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                }
+          -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+            -- STABLE_SORT [$$9(DESC)]  |LOCAL|
+              -- HASH_PARTITION_EXCHANGE [$$9]  |PARTITIONED|
+                -- STREAM_PROJECT  |PARTITIONED|
+                  -- ASSIGN  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- DATASOURCE_SCAN  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/orders-aggreg.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/orders-aggreg.plan
new file mode 100644
index 0000000..df2a96e
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/orders-aggreg.plan
@@ -0,0 +1,25 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$24]  |PARTITIONED|
+                  {
+                    -- AGGREGATE  |LOCAL|
+                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                  }
+            -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$24(ASC)] HASH:[$$24]  |PARTITIONED|
+              -- PRE_CLUSTERED_GROUP_BY[$$16]  |LOCAL|
+                      {
+                        -- AGGREGATE  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                      }
+                -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                  -- STABLE_SORT [$$16(ASC)]  |LOCAL|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- STREAM_PROJECT  |PARTITIONED|
+                        -- ASSIGN  |PARTITIONED|
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            -- DATASOURCE_SCAN  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/orders-index-search-conjunctive_01.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/orders-index-search-conjunctive_01.plan
new file mode 100644
index 0000000..6c99d34
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/orders-index-search-conjunctive_01.plan
@@ -0,0 +1,18 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- STREAM_PROJECT  |PARTITIONED|
+    -- ASSIGN  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$11(ASC) ]  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- BTREE_SEARCH  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                    -- STABLE_SORT [$$19(ASC)]  |LOCAL|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            -- BTREE_SEARCH  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- ASSIGN  |PARTITIONED|
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/orders-index-search-conjunctive_02.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/orders-index-search-conjunctive_02.plan
new file mode 100644
index 0000000..7aff2c2
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/orders-index-search-conjunctive_02.plan
@@ -0,0 +1,18 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- STREAM_PROJECT  |PARTITIONED|
+    -- ASSIGN  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$12(ASC) ]  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- BTREE_SEARCH  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                    -- STABLE_SORT [$$21(ASC)]  |LOCAL|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            -- BTREE_SEARCH  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- ASSIGN  |PARTITIONED|
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/orders-index-search.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/orders-index-search.plan
new file mode 100644
index 0000000..ce5cbbf
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/orders-index-search.plan
@@ -0,0 +1,16 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- ASSIGN  |PARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            -- BTREE_SEARCH  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                -- STABLE_SORT [$$13(ASC)]  |LOCAL|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- STREAM_PROJECT  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- BTREE_SEARCH  |PARTITIONED|
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/prim-idx-search.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/prim-idx-search.plan
new file mode 100644
index 0000000..4ac0fda
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/prim-idx-search.plan
@@ -0,0 +1,10 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- ASSIGN  |PARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            -- BTREE_SEARCH  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- ASSIGN  |PARTITIONED|
+                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/pull_select_above_eq_join.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/pull_select_above_eq_join.plan
new file mode 100644
index 0000000..a82190a
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/pull_select_above_eq_join.plan
@@ -0,0 +1,21 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- STREAM_SELECT  |UNPARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            -- HYBRID_HASH_JOIN [$$18][$$19]  |PARTITIONED|
+              -- HASH_PARTITION_EXCHANGE [$$18]  |PARTITIONED|
+                -- STREAM_PROJECT  |PARTITIONED|
+                  -- ASSIGN  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- DATASOURCE_SCAN  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+              -- HASH_PARTITION_EXCHANGE [$$19]  |PARTITIONED|
+                -- STREAM_PROJECT  |PARTITIONED|
+                  -- ASSIGN  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- DATASOURCE_SCAN  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/push-project-through-group.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/push-project-through-group.plan
new file mode 100644
index 0000000..e74eaee
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/push-project-through-group.plan
@@ -0,0 +1,31 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$15]  |PARTITIONED|
+                  {
+                    -- AGGREGATE  |LOCAL|
+                      -- STREAM_SELECT  |LOCAL|
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                  }
+            -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+              -- STABLE_SORT [$$15(ASC)]  |LOCAL|
+                -- HASH_PARTITION_EXCHANGE [$$15]  |PARTITIONED|
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$17][$$16]  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$17]  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$16]  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/push_limit.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/push_limit.plan
new file mode 100644
index 0000000..3400b25
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/push_limit.plan
@@ -0,0 +1,13 @@
+-- SINK_WRITE  |UNPARTITIONED|
+  -- STREAM_PROJECT  |UNPARTITIONED|
+    -- ASSIGN  |UNPARTITIONED|
+      -- STREAM_LIMIT  |UNPARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$8(ASC) ]  |PARTITIONED|
+          -- STREAM_PROJECT  |PARTITIONED|
+            -- STREAM_SELECT  |PARTITIONED|
+              -- ASSIGN  |PARTITIONED|
+                -- STREAM_LIMIT  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- DATASOURCE_SCAN  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/q1.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/q1.plan
new file mode 100644
index 0000000..d723324
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/q1.plan
@@ -0,0 +1,18 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- STREAM_SELECT  |PARTITIONED|
+          -- SUBPLAN  |PARTITIONED|
+                  {
+                    -- AGGREGATE  |LOCAL|
+                      -- STREAM_SELECT  |LOCAL|
+                        -- UNNEST  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                  }
+            -- STREAM_PROJECT  |PARTITIONED|
+              -- ASSIGN  |PARTITIONED|
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  -- DATASOURCE_SCAN  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/q2.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/q2.plan
new file mode 100644
index 0000000..f4cc5ec
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/q2.plan
@@ -0,0 +1,40 @@
+-- SINK_WRITE  |UNPARTITIONED|
+  -- STREAM_PROJECT  |UNPARTITIONED|
+    -- ASSIGN  |UNPARTITIONED|
+      -- STREAM_LIMIT  |UNPARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$26(DESC) ]  |PARTITIONED|
+          -- STREAM_LIMIT  |LOCAL|
+            -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+              -- STABLE_SORT [$$26(DESC)]  |LOCAL|
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  -- PRE_CLUSTERED_GROUP_BY[$$31]  |PARTITIONED|
+                          {
+                            -- AGGREGATE  |LOCAL|
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          }
+                          {
+                            -- AGGREGATE  |LOCAL|
+                              -- MICRO_PRE_CLUSTERED_GROUP_BY[$$32]  |LOCAL|
+                                      {
+                                        -- AGGREGATE  |LOCAL|
+                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      }
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          }
+                    -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$31(ASC), $$32(ASC)] HASH:[$$31]  |PARTITIONED|
+                      -- PRE_CLUSTERED_GROUP_BY[$$23, $$24]  |LOCAL|
+                              {
+                                -- AGGREGATE  |LOCAL|
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              }
+                        -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                          -- STABLE_SORT [$$23(ASC), $$24(ASC)]  |LOCAL|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ASSIGN  |PARTITIONED|
+                                  -- UNNEST  |PARTITIONED|
+                                    -- ASSIGN  |PARTITIONED|
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- DATASOURCE_SCAN  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/q3_shipping_priority.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/q3_shipping_priority.plan
new file mode 100644
index 0000000..1302637
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/q3_shipping_priority.plan
@@ -0,0 +1,53 @@
+-- SINK_WRITE  |UNPARTITIONED|
+  -- STREAM_PROJECT  |UNPARTITIONED|
+    -- ASSIGN  |UNPARTITIONED|
+      -- STREAM_LIMIT  |UNPARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$44(DESC), $$4(ASC) ]  |PARTITIONED|
+          -- STREAM_LIMIT  |LOCAL|
+            -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+              -- STABLE_SORT [$$44(DESC), $$4(ASC)]  |LOCAL|
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  -- EXTERNAL_GROUP_BY[$$55, $$56, $$57]  |PARTITIONED|
+                          {
+                            -- AGGREGATE  |LOCAL|
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          }
+                    -- HASH_PARTITION_EXCHANGE [$$55, $$57, $$56]  |PARTITIONED|
+                      -- EXTERNAL_GROUP_BY[$$42, $$46, $$39]  |LOCAL|
+                              {
+                                -- AGGREGATE  |LOCAL|
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              }
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- HYBRID_HASH_JOIN [$$41][$$42]  |PARTITIONED|
+                                -- HASH_PARTITION_EXCHANGE [$$41]  |PARTITIONED|
+                                  -- STREAM_PROJECT  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- HYBRID_HASH_JOIN [$$40][$$48]  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- STREAM_PROJECT  |PARTITIONED|
+                                            -- STREAM_SELECT  |PARTITIONED|
+                                              -- ASSIGN  |PARTITIONED|
+                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                        -- HASH_PARTITION_EXCHANGE [$$48]  |PARTITIONED|
+                                          -- STREAM_PROJECT  |PARTITIONED|
+                                            -- ASSIGN  |PARTITIONED|
+                                              -- STREAM_SELECT  |PARTITIONED|
+                                                -- ASSIGN  |PARTITIONED|
+                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                    -- DATASOURCE_SCAN  |PARTITIONED|
+                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                -- HASH_PARTITION_EXCHANGE [$$42]  |PARTITIONED|
+                                  -- STREAM_PROJECT  |PARTITIONED|
+                                    -- STREAM_SELECT  |PARTITIONED|
+                                      -- ASSIGN  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- DATASOURCE_SCAN  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/q5_local_supplier_volume.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/q5_local_supplier_volume.plan
new file mode 100644
index 0000000..d2682d8
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/q5_local_supplier_volume.plan
@@ -0,0 +1,81 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- STREAM_PROJECT  |PARTITIONED|
+    -- ASSIGN  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$87(DESC) ]  |PARTITIONED|
+        -- STABLE_SORT [$$87(DESC)]  |LOCAL|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            -- EXTERNAL_GROUP_BY[$$121]  |PARTITIONED|
+                    {
+                      -- AGGREGATE  |LOCAL|
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    }
+              -- HASH_PARTITION_EXCHANGE [$$121]  |PARTITIONED|
+                -- EXTERNAL_GROUP_BY[$$93]  |LOCAL|
+                        {
+                          -- AGGREGATE  |LOCAL|
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        }
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- STREAM_PROJECT  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- HYBRID_HASH_JOIN [$$80, $$116][$$113, $$95]  |PARTITIONED|
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            -- STREAM_PROJECT  |PARTITIONED|
+                              -- ASSIGN  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                          -- HASH_PARTITION_EXCHANGE [$$113]  |PARTITIONED|
+                            -- STREAM_PROJECT  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- HYBRID_HASH_JOIN [$$81][$$82]  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- STREAM_PROJECT  |PARTITIONED|
+                                      -- STREAM_SELECT  |PARTITIONED|
+                                        -- ASSIGN  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- DATASOURCE_SCAN  |PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                  -- HASH_PARTITION_EXCHANGE [$$82]  |PARTITIONED|
+                                    -- STREAM_PROJECT  |PARTITIONED|
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- HYBRID_HASH_JOIN [$$100][$$84]  |PARTITIONED|
+                                          -- HASH_PARTITION_EXCHANGE [$$100]  |PARTITIONED|
+                                            -- STREAM_PROJECT  |PARTITIONED|
+                                              -- ASSIGN  |PARTITIONED|
+                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                          -- HASH_PARTITION_EXCHANGE [$$84]  |PARTITIONED|
+                                            -- STREAM_PROJECT  |PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                -- HYBRID_HASH_JOIN [$$95][$$85]  |PARTITIONED|
+                                                  -- HASH_PARTITION_EXCHANGE [$$95]  |PARTITIONED|
+                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                      -- ASSIGN  |PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                          -- DATASOURCE_SCAN  |PARTITIONED|
+                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                  -- HASH_PARTITION_EXCHANGE [$$85]  |PARTITIONED|
+                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                        -- HYBRID_HASH_JOIN [$$91][$$86]  |PARTITIONED|
+                                                          -- HASH_PARTITION_EXCHANGE [$$91]  |PARTITIONED|
+                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                              -- ASSIGN  |PARTITIONED|
+                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                              -- STREAM_SELECT  |PARTITIONED|
+                                                                -- ASSIGN  |PARTITIONED|
+                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                    -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/record_access.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/record_access.plan
new file mode 100644
index 0000000..70e2daa
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/record_access.plan
@@ -0,0 +1,4 @@
+-- SINK_WRITE  |UNPARTITIONED|
+  -- STREAM_PROJECT  |UNPARTITIONED|
+    -- ASSIGN  |UNPARTITIONED|
+      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/rtree-secondary-index.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/rtree-secondary-index.plan
new file mode 100644
index 0000000..2b4529d
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/rtree-secondary-index.plan
@@ -0,0 +1,17 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- STREAM_SELECT  |PARTITIONED|
+          -- ASSIGN  |PARTITIONED|
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+              -- BTREE_SEARCH  |PARTITIONED|
+                -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                  -- STABLE_SORT [$$18(ASC)]  |LOCAL|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- STREAM_PROJECT  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- RTREE_SEARCH  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- ASSIGN  |PARTITIONED|
+                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/scan-delete-all.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/scan-delete-all.plan
new file mode 100644
index 0000000..3c95e2f
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/scan-delete-all.plan
@@ -0,0 +1,14 @@
+-- SINK  |PARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+    -- INSERT_DELETE  |PARTITIONED|
+      -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+        -- STABLE_SORT [$$19(ASC)]  |LOCAL|
+          -- HASH_PARTITION_EXCHANGE [$$19]  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- STREAM_PROJECT  |PARTITIONED|
+                -- ASSIGN  |PARTITIONED|
+                  -- ASSIGN  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- DATASOURCE_SCAN  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/scan-delete-rtree-secondary-index.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/scan-delete-rtree-secondary-index.plan
new file mode 100644
index 0000000..ede1063
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/scan-delete-rtree-secondary-index.plan
@@ -0,0 +1,23 @@
+-- SINK  |PARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+    -- INDEX_INSERT_DELETE  |UNPARTITIONED|
+      -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+        -- STABLE_SORT [$$25(ASC), $$26(ASC), $$27(ASC), $$28(ASC)]  |LOCAL|
+          -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+            -- ASSIGN  |UNPARTITIONED|
+              -- ASSIGN  |UNPARTITIONED|
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  -- INSERT_DELETE  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                      -- STABLE_SORT [$$13(ASC)]  |LOCAL|
+                        -- HASH_PARTITION_EXCHANGE [$$13]  |PARTITIONED|
+                          -- ASSIGN  |PARTITIONED|
+                            -- STREAM_PROJECT  |PARTITIONED|
+                              -- ASSIGN  |PARTITIONED|
+                                -- ASSIGN  |PARTITIONED|
+                                  -- ASSIGN  |PARTITIONED|
+                                    -- STREAM_SELECT  |PARTITIONED|
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- DATASOURCE_SCAN  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/scan-delete.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/scan-delete.plan
new file mode 100644
index 0000000..f1a7172
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/scan-delete.plan
@@ -0,0 +1,16 @@
+-- SINK  |PARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+    -- INSERT_DELETE  |PARTITIONED|
+      -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+        -- STABLE_SORT [$$21(ASC)]  |LOCAL|
+          -- HASH_PARTITION_EXCHANGE [$$21]  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- STREAM_PROJECT  |PARTITIONED|
+                -- ASSIGN  |PARTITIONED|
+                  -- ASSIGN  |PARTITIONED|
+                    -- STREAM_SELECT  |PARTITIONED|
+                      -- ASSIGN  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- DATASOURCE_SCAN  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/scan-insert-secondary-index.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/scan-insert-secondary-index.plan
new file mode 100644
index 0000000..c1bed36
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/scan-insert-secondary-index.plan
@@ -0,0 +1,27 @@
+-- SINK  |PARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+    -- INDEX_INSERT_DELETE  |UNPARTITIONED|
+      -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+        -- STABLE_SORT [$$12(ASC)]  |LOCAL|
+          -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+            -- ASSIGN  |UNPARTITIONED|
+              -- STREAM_PROJECT  |UNPARTITIONED|
+                -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                  -- INDEX_INSERT_DELETE  |UNPARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                      -- STABLE_SORT [$$11(ASC)]  |LOCAL|
+                        -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                          -- ASSIGN  |UNPARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- INSERT_DELETE  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                                  -- STABLE_SORT [$$6(ASC)]  |LOCAL|
+                                    -- HASH_PARTITION_EXCHANGE [$$6]  |PARTITIONED|
+                                      -- ASSIGN  |PARTITIONED|
+                                        -- STREAM_PROJECT  |PARTITIONED|
+                                          -- ASSIGN  |PARTITIONED|
+                                            -- ASSIGN  |PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/scan-insert.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/scan-insert.plan
new file mode 100644
index 0000000..2fe55a5
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/scan-insert.plan
@@ -0,0 +1,14 @@
+-- SINK  |PARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+    -- INSERT_DELETE  |PARTITIONED|
+      -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+        -- STABLE_SORT [$$6(ASC)]  |LOCAL|
+          -- HASH_PARTITION_EXCHANGE [$$6]  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- STREAM_PROJECT  |PARTITIONED|
+                -- ASSIGN  |PARTITIONED|
+                  -- ASSIGN  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- DATASOURCE_SCAN  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/sort-cust.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/sort-cust.plan
new file mode 100644
index 0000000..f790019
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/sort-cust.plan
@@ -0,0 +1,15 @@
+-- SINK_WRITE  |UNPARTITIONED|
+  -- STREAM_PROJECT  |UNPARTITIONED|
+    -- ASSIGN  |UNPARTITIONED|
+      -- STREAM_LIMIT  |UNPARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$7(ASC) ]  |PARTITIONED|
+          -- STREAM_LIMIT  |LOCAL|
+            -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+              -- STABLE_SORT [$$7(ASC)]  |LOCAL|
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    -- ASSIGN  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- DATASOURCE_SCAN  |PARTITIONED|
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterix/asterix-app/src/test/resources/optimizerts/results/unnest_list_in_subplan.plan b/asterix/asterix-app/src/test/resources/optimizerts/results/unnest_list_in_subplan.plan
new file mode 100644
index 0000000..0a2d8a3
--- /dev/null
+++ b/asterix/asterix-app/src/test/resources/optimizerts/results/unnest_list_in_subplan.plan
@@ -0,0 +1,33 @@
+-- SINK_WRITE  |PARTITIONED|
+  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$20]  |PARTITIONED|
+                  {
+                    -- AGGREGATE  |LOCAL|
+                      -- STREAM_SELECT  |LOCAL|
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                  }
+            -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+              -- STABLE_SORT [$$20(ASC), $$18(ASC)]  |LOCAL|
+                -- HASH_PARTITION_EXCHANGE [$$20]  |PARTITIONED|
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$4][$$22]  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$4]  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- UNNEST  |PARTITIONED|
+                              -- ASSIGN  |PARTITIONED|
+                                -- ASSIGN  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- DATASOURCE_SCAN  |PARTITIONED|
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$22]  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|