|
@@ -18,7 +18,7 @@ func TestLeftJoinPlan_Apply(t *testing.T) {
|
|
|
data xsql.WindowTuplesSet
|
|
|
result interface{}
|
|
|
}{
|
|
|
- {
|
|
|
+ { //0
|
|
|
sql: "SELECT id1 FROM src1 left join src2 on src1.id1 = src2.id2",
|
|
|
data: xsql.WindowTuplesSet{
|
|
|
xsql.WindowTuples{
|
|
@@ -73,7 +73,7 @@ func TestLeftJoinPlan_Apply(t *testing.T) {
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
- {
|
|
|
+ { // 1
|
|
|
sql: "SELECT id1 FROM src1 left join src2 on src1.id1 = src2.id2",
|
|
|
data: xsql.WindowTuplesSet{
|
|
|
xsql.WindowTuples{
|
|
@@ -127,7 +127,7 @@ func TestLeftJoinPlan_Apply(t *testing.T) {
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
- {
|
|
|
+ { // 2
|
|
|
sql: "SELECT id1 FROM src1 left join src2 on src1.ts = src2.ts",
|
|
|
data: xsql.WindowTuplesSet{
|
|
|
xsql.WindowTuples{
|
|
@@ -182,7 +182,7 @@ func TestLeftJoinPlan_Apply(t *testing.T) {
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
- {
|
|
|
+ { // 3
|
|
|
sql: "SELECT id1 FROM src1 inner join src2 on src1.id1 = src2.id2",
|
|
|
data: xsql.WindowTuplesSet{
|
|
|
xsql.WindowTuples{
|
|
@@ -220,7 +220,7 @@ func TestLeftJoinPlan_Apply(t *testing.T) {
|
|
|
result: nil,
|
|
|
},
|
|
|
|
|
|
- {
|
|
|
+ { // 4
|
|
|
sql: "SELECT id1 FROM src1 As s1 left join src2 as s2 on s1.id1 = s2.id2",
|
|
|
data: xsql.WindowTuplesSet{
|
|
|
xsql.WindowTuples{
|
|
@@ -276,7 +276,7 @@ func TestLeftJoinPlan_Apply(t *testing.T) {
|
|
|
},
|
|
|
},
|
|
|
|
|
|
- {
|
|
|
+ { // 5
|
|
|
sql: "SELECT id1 FROM src1 left join src2 on src1.id1 = src2.id2",
|
|
|
data: xsql.WindowTuplesSet{
|
|
|
xsql.WindowTuples{
|
|
@@ -307,13 +307,18 @@ func TestLeftJoinPlan_Apply(t *testing.T) {
|
|
|
Tuples: []xsql.Tuple{
|
|
|
{Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
|
|
|
{Emitter: "src2", Message: xsql.Message{"id2": 1, "f2": "w1"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
|
|
|
{Emitter: "src2", Message: xsql.Message{"id2": 1, "f2": "w2"}},
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
|
|
|
- {
|
|
|
+ { // 6
|
|
|
sql: "SELECT id1 FROM src1 left join src2 on src1.id1 = src2.id2",
|
|
|
data: xsql.WindowTuplesSet{
|
|
|
xsql.WindowTuples{
|
|
@@ -647,6 +652,152 @@ func TestLeftJoinPlan_Apply(t *testing.T) {
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
+ {
|
|
|
+ sql: "SELECT id1 FROM src1 left join src2 on src1.id1 = src2.id2",
|
|
|
+ data: xsql.WindowTuplesSet{
|
|
|
+ xsql.WindowTuples{
|
|
|
+ Emitter: "src1",
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {
|
|
|
+ Emitter: "src1",
|
|
|
+ Message: xsql.Message{"id1": 1, "f1": "v1"},
|
|
|
+ }, {
|
|
|
+ Emitter: "src1",
|
|
|
+ Message: xsql.Message{"id1": 1, "f1": "v2"},
|
|
|
+ }, {
|
|
|
+ Emitter: "src1",
|
|
|
+ Message: xsql.Message{"id1": 3, "f1": "v3"},
|
|
|
+ }, {
|
|
|
+ Emitter: "src1",
|
|
|
+ Message: xsql.Message{"id1": 3, "f1": "v4"},
|
|
|
+ }, {
|
|
|
+ Emitter: "src1",
|
|
|
+ Message: xsql.Message{"id1": 4, "f1": "v5"},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ xsql.WindowTuples{
|
|
|
+ Emitter: "src2",
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {
|
|
|
+ Emitter: "src2",
|
|
|
+ Message: xsql.Message{"id2": 1, "f2": "w1"},
|
|
|
+ }, {
|
|
|
+ Emitter: "src2",
|
|
|
+ Message: xsql.Message{"id2": 3, "f2": "w2"},
|
|
|
+ }, {
|
|
|
+ Emitter: "src2",
|
|
|
+ Message: xsql.Message{"id2": 3, "f2": "w3"},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ result: xsql.JoinTupleSets{
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
|
|
|
+ {Emitter: "src2", Message: xsql.Message{"id2": 1, "f2": "w1"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v2"}},
|
|
|
+ {Emitter: "src2", Message: xsql.Message{"id2": 1, "f2": "w1"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 3, "f1": "v3"}},
|
|
|
+ {Emitter: "src2", Message: xsql.Message{"id2": 3, "f2": "w2"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 3, "f1": "v3"}},
|
|
|
+ {Emitter: "src2", Message: xsql.Message{"id2": 3, "f2": "w3"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 3, "f1": "v4"}},
|
|
|
+ {Emitter: "src2", Message: xsql.Message{"id2": 3, "f2": "w2"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 3, "f1": "v4"}},
|
|
|
+ {Emitter: "src2", Message: xsql.Message{"id2": 3, "f2": "w3"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 4, "f1": "v5"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ sql: "SELECT id1 FROM src1 full join src2 on src1.id1 = src2.id2",
|
|
|
+ data: xsql.WindowTuplesSet{
|
|
|
+ xsql.WindowTuples{
|
|
|
+ Emitter: "src1",
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {
|
|
|
+ Emitter: "src1",
|
|
|
+ Message: xsql.Message{"id1": 1, "f1": "v1"},
|
|
|
+ }, {
|
|
|
+ Emitter: "src1",
|
|
|
+ Message: xsql.Message{"id1": 2, "f1": "v2"},
|
|
|
+ }, {
|
|
|
+ Emitter: "src1",
|
|
|
+ Message: xsql.Message{"id1": 3, "f1": "v3"},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ xsql.WindowTuples{
|
|
|
+ Emitter: "src2",
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {
|
|
|
+ Emitter: "src2",
|
|
|
+ Message: xsql.Message{"id2": 1, "f2": "w1"},
|
|
|
+ }, {
|
|
|
+ Emitter: "src2",
|
|
|
+ Message: xsql.Message{"id2": 2, "f2": "w2"},
|
|
|
+ }, {
|
|
|
+ Emitter: "src2",
|
|
|
+ Message: xsql.Message{"id2": 2, "f2": "w3"},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ result: xsql.JoinTupleSets{
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
|
|
|
+ {Emitter: "src2", Message: xsql.Message{"id2": 1, "f2": "w1"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 2, "f1": "v2"}},
|
|
|
+ {Emitter: "src2", Message: xsql.Message{"id2": 2, "f2": "w2"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 2, "f1": "v2"}},
|
|
|
+ {Emitter: "src2", Message: xsql.Message{"id2": 2, "f2": "w3"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 3, "f1": "v3"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
}
|
|
|
|
|
|
fmt.Printf("The test bucket size is %d.\n\n", len(tests))
|
|
@@ -1113,6 +1264,62 @@ func TestInnerJoinPlan_Apply(t *testing.T) {
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
+ {
|
|
|
+ sql: "SELECT id1 FROM src1 As s1 inner join src2 as s2 on s1.id1 = s2.id2",
|
|
|
+ data: xsql.WindowTuplesSet{
|
|
|
+ xsql.WindowTuples{
|
|
|
+ Emitter: "s1",
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {
|
|
|
+ Emitter: "s1",
|
|
|
+ Message: xsql.Message{"id1": 1, "f1": "v1"},
|
|
|
+ }, {
|
|
|
+ Emitter: "s1",
|
|
|
+ Message: xsql.Message{"id1": 2, "f1": "v2"},
|
|
|
+ }, {
|
|
|
+ Emitter: "s1",
|
|
|
+ Message: xsql.Message{"id1": 3, "f1": "v3"},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ xsql.WindowTuples{
|
|
|
+ Emitter: "s2",
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {
|
|
|
+ Emitter: "s2",
|
|
|
+ Message: xsql.Message{"id2": 1, "f2": "w1"},
|
|
|
+ }, {
|
|
|
+ Emitter: "s2",
|
|
|
+ Message: xsql.Message{"id2": 2, "f2": "w2"},
|
|
|
+ }, {
|
|
|
+ Emitter: "s2",
|
|
|
+ Message: xsql.Message{"id2": 2, "f2": "w3"},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ result: xsql.JoinTupleSets{
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "s1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
|
|
|
+ {Emitter: "s2", Message: xsql.Message{"id2": 1, "f2": "w1"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "s1", Message: xsql.Message{"id1": 2, "f1": "v2"}},
|
|
|
+ {Emitter: "s2", Message: xsql.Message{"id2": 2, "f2": "w2"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "s1", Message: xsql.Message{"id1": 2, "f1": "v2"}},
|
|
|
+ {Emitter: "s2", Message: xsql.Message{"id2": 2, "f2": "w3"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
}
|
|
|
|
|
|
fmt.Printf("The test bucket size is %d.\n\n", len(tests))
|
|
@@ -1215,7 +1422,7 @@ func TestRightJoinPlan_Apply(t *testing.T) {
|
|
|
Message: xsql.Message{"id1": 2, "f1": "v2"},
|
|
|
}, {
|
|
|
Emitter: "src1",
|
|
|
- Message: xsql.Message{"id1": 3, "f1": "v3"},
|
|
|
+ Message: xsql.Message{"id1": 1, "f1": "v3"},
|
|
|
},
|
|
|
},
|
|
|
},
|
|
@@ -1243,6 +1450,12 @@ func TestRightJoinPlan_Apply(t *testing.T) {
|
|
|
{Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
|
|
|
},
|
|
|
},
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src2", Message: xsql.Message{"id2": 1, "f2": "w1"}},
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v3"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
|
|
|
xsql.JoinTuple{
|
|
|
Tuples: []xsql.Tuple{
|
|
@@ -1378,6 +1591,12 @@ func TestFullJoinPlan_Apply(t *testing.T) {
|
|
|
Tuples: []xsql.Tuple{
|
|
|
{Emitter: "src1", Message: xsql.Message{"id1": 2, "f1": "v2"}},
|
|
|
{Emitter: "src2", Message: xsql.Message{"id2": 2, "f2": "w2"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 2, "f1": "v2"}},
|
|
|
{Emitter: "src2", Message: xsql.Message{"id2": 2, "f2": "w4"}},
|
|
|
},
|
|
|
},
|
|
@@ -1619,7 +1838,17 @@ func TestCrossJoinPlan_Apply(t *testing.T) {
|
|
|
Tuples: []xsql.Tuple{
|
|
|
{Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
|
|
|
{Emitter: "src2", Message: xsql.Message{"id2": 1, "f2": "w1"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
|
|
|
{Emitter: "src2", Message: xsql.Message{"id2": 2, "f2": "w2"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
|
|
|
{Emitter: "src2", Message: xsql.Message{"id2": 4, "f2": "w3"}},
|
|
|
},
|
|
|
},
|
|
@@ -1628,7 +1857,17 @@ func TestCrossJoinPlan_Apply(t *testing.T) {
|
|
|
Tuples: []xsql.Tuple{
|
|
|
{Emitter: "src1", Message: xsql.Message{"id1": 2, "f1": "v2"}},
|
|
|
{Emitter: "src2", Message: xsql.Message{"id2": 1, "f2": "w1"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 2, "f1": "v2"}},
|
|
|
{Emitter: "src2", Message: xsql.Message{"id2": 2, "f2": "w2"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 2, "f1": "v2"}},
|
|
|
{Emitter: "src2", Message: xsql.Message{"id2": 4, "f2": "w3"}},
|
|
|
},
|
|
|
},
|
|
@@ -1637,7 +1876,17 @@ func TestCrossJoinPlan_Apply(t *testing.T) {
|
|
|
Tuples: []xsql.Tuple{
|
|
|
{Emitter: "src1", Message: xsql.Message{"id1": 3, "f1": "v3"}},
|
|
|
{Emitter: "src2", Message: xsql.Message{"id2": 1, "f2": "w1"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 3, "f1": "v3"}},
|
|
|
{Emitter: "src2", Message: xsql.Message{"id2": 2, "f2": "w2"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 3, "f1": "v3"}},
|
|
|
{Emitter: "src2", Message: xsql.Message{"id2": 4, "f2": "w3"}},
|
|
|
},
|
|
|
},
|
|
@@ -1675,6 +1924,11 @@ func TestCrossJoinPlan_Apply(t *testing.T) {
|
|
|
Tuples: []xsql.Tuple{
|
|
|
{Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
|
|
|
{Emitter: "src2", Message: xsql.Message{"id2": 1, "f2": "w1"}},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xsql.JoinTuple{
|
|
|
+ Tuples: []xsql.Tuple{
|
|
|
+ {Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
|
|
|
{Emitter: "src2", Message: xsql.Message{"id2": 1, "f2": "w2"}},
|
|
|
},
|
|
|
},
|