/**
* Copyright 2013-2014 Recruit Technologies Co., Ltd. and contributors
* (see CONTRIBUTORS.md)
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. A copy of the
* License is distributed with this work in the LICENSE.md file. You may
* also obtain a copy of the License from
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.gennai.gungnir.topology.operator.tuplejoin;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import java.util.List;
import org.gennai.gungnir.tuple.FieldAccessor;
import org.gennai.gungnir.tuple.GungnirTuple;
import org.gennai.gungnir.tuple.TupleAccessor;
import org.gennai.gungnir.tuple.schema.TupleSchema;
import org.junit.Test;
import com.google.common.collect.Lists;
public class TestJoinContext {
@Test
public void testSimpleContext() throws Exception {
TupleAccessor t1 = new TupleAccessor("t1");
TupleAccessor t2 = new TupleAccessor("t2");
SimpleJoinContext simpleContext1 = new SimpleJoinContext(t1,
Lists.<FieldAccessor>newArrayList(t1.field("f1"), t1.field("f3")));
simpleContext1.setJoinKey(new SimpleJoinKey(t1.field("f0")));
FieldAccessor t1f1 = new FieldAccessor("+t1:f1");
FieldAccessor t1f3 = new FieldAccessor("+t1:f3");
FieldAccessor t2f1 = new FieldAccessor("+t2:f1");
FieldAccessor t2f3 = new FieldAccessor("+t2:f3");
GungnirTuple tuple1 = GungnirTuple.builder(
new TupleSchema("t1").field("f0").field("f1").field("f2").field("f3"))
.put("f0", "t1f0").put("f1", "t1f1").put("f2", "t1f2").put("f3", "t1f3").build();
GungnirTuple tuple2 = GungnirTuple.builder(
new TupleSchema("t2").field("f0").field("f1").field("f2").field("f3"))
.put("f0", "t2f0").put("f1", "t2f1").put("f2", "t2f2").put("f3", "t2f3").build();
assertThat(simpleContext1.getFields(),
is((List<FieldAccessor>) Lists.<FieldAccessor>newArrayList(t1.field("f1"),
t1.field("f3"))));
assertThat(simpleContext1.getJoinKey(), is((JoinKey) new SimpleJoinKey(t1.field("f0"))));
assertThat(simpleContext1.getOutputFields(),
is((List<FieldAccessor>) Lists.<FieldAccessor>newArrayList(t1f1, t1f3)));
assertThat(simpleContext1.getKey(tuple1), is((Object) "t1f0"));
assertThat(simpleContext1.getValues(tuple1),
is((List<Object>) Lists.<Object>newArrayList("t1f1", "t1f3")));
SimpleJoinContext simpleContext2 = new SimpleJoinContext(t2,
Lists.<FieldAccessor>newArrayList(t2.field("f3"), t2.field("f1")));
simpleContext2.setJoinKey(new SimpleJoinKey(t2.field("f1")));
assertThat(simpleContext2.getFields(),
is((List<FieldAccessor>) Lists.<FieldAccessor>newArrayList(t2.field("f3"),
t2.field("f1"))));
assertThat(simpleContext2.getJoinKey(), is((JoinKey) new SimpleJoinKey(t2.field("f1"))));
assertThat(simpleContext2.getOutputFields(),
is((List<FieldAccessor>) Lists.<FieldAccessor>newArrayList(t2f3, t2f1)));
assertThat(simpleContext2.getKey(tuple2), is((Object) "t2f1"));
assertThat(simpleContext2.getValues(tuple2),
is((List<Object>) Lists.<Object>newArrayList("t2f3", "t2f1")));
SimpleJoinContext simpleContext3 = new SimpleJoinContext(t1,
Lists.<FieldAccessor>newArrayList(t1.field("f1"), t1.field("f3")));
ComplexJoinKey joinKey = new ComplexJoinKey();
joinKey.add(new SimpleJoinKey(t1.field("f0")));
joinKey.add(new SimpleJoinKey(t1.field("f1")));
simpleContext3.setJoinKey(joinKey);
assertThat(simpleContext3.getFields(),
is((List<FieldAccessor>) Lists.<FieldAccessor>newArrayList(t1.field("f1"),
t1.field("f3"))));
assertThat(simpleContext3.getJoinKey(), is((JoinKey) joinKey));
assertThat(simpleContext3.getOutputFields(),
is((List<FieldAccessor>) Lists.<FieldAccessor>newArrayList(t1f1, t1f3)));
assertThat(simpleContext3.getKey(tuple1), is((Object) Lists.newArrayList("t1f0", "t1f1")));
assertThat(simpleContext3.getValues(tuple1),
is((List<Object>) Lists.<Object>newArrayList("t1f1", "t1f3")));
}
@Test
public void testComplexContext() throws Exception {
TupleAccessor t1 = new TupleAccessor("t1");
TupleAccessor t2 = new TupleAccessor("t2");
TupleAccessor t3 = new TupleAccessor("t3");
TupleAccessor t4 = new TupleAccessor("t4");
SimpleJoinContext simpleContext1 = new SimpleJoinContext(t1,
Lists.<FieldAccessor>newArrayList(t1.field("f1"), t1.field("f3")));
simpleContext1.setJoinKey(new SimpleJoinKey(t1.field("f0")));
SimpleJoinContext simpleContext2 = new SimpleJoinContext(t2,
Lists.<FieldAccessor>newArrayList(t2.field("f3"), t2.field("f1")));
simpleContext2.setJoinKey(new SimpleJoinKey(t2.field("f1")));
SimpleJoinContext simpleContext3 = new SimpleJoinContext(t3,
Lists.<FieldAccessor>newArrayList(t3.field("f2"), t3.field("f1")));
simpleContext3.setJoinKey(new SimpleJoinKey(t3.field("f2")));
ComplexJoinContext complexContext1 = new ComplexJoinContext();
complexContext1.addContext(simpleContext1);
complexContext1.addContext(simpleContext2);
complexContext1.addContext(simpleContext3);
complexContext1.setJoinKey(new SimpleJoinKey(t2.field("f2")));
FieldAccessor t1f1 = new FieldAccessor("+t1:f1");
FieldAccessor t1f3 = new FieldAccessor("+t1:f3");
FieldAccessor t2f1 = new FieldAccessor("+t2:f1");
FieldAccessor t2f2 = new FieldAccessor("+t2:f2");
FieldAccessor t2f3 = new FieldAccessor("+t2:f3");
FieldAccessor t3f1 = new FieldAccessor("+t3:f1");
FieldAccessor t3f2 = new FieldAccessor("+t3:f2");
GungnirTuple tuple1 = GungnirTuple.builder(
new TupleSchema("t1").field("+t1:f1").field("+t1:f3").field("+t1:f0").field("+t2:f3")
.field("+t2:f1").field("+t3:f2").field("+t3:f1").field("+t2:f2"))
.put("+t1:f1", "t1f1").put("+t1:f3", "t1f3").put("+t1:f0", "t1f0").put("+t2:f3", "t2f3")
.put("+t2:f1", "t2f1").put("+t3:f2", "t3f2").put("+t3:f1", "t3f1").put("+t2:f2", "t2f2")
.build();
assertThat(complexContext1.getFields(),
is((List<FieldAccessor>) Lists.<FieldAccessor>newArrayList(t1f1, t1f3, t2f3, t2f1, t3f2,
t3f1, t2f2)));
assertThat(complexContext1.getJoinKey(), is((JoinKey) new SimpleJoinKey(t2.field("f2"))));
assertThat(complexContext1.getOutputFields(),
is((List<FieldAccessor>) Lists.<FieldAccessor>newArrayList(t1f1, t1f3, t2f3, t2f1, t3f2,
t3f1, t2f2)));
assertThat(complexContext1.getKey(tuple1), is((Object) "t2f2"));
assertThat(complexContext1.getValues(tuple1),
is((List<Object>) Lists.<Object>newArrayList("t1f1", "t1f3", "t1f0", "t2f3", "t2f1",
"t3f2", "t3f1", "t2f2")));
ComplexJoinContext complexContext2 = new ComplexJoinContext();
complexContext2.addContext(simpleContext1);
complexContext2.addContext(simpleContext2);
complexContext2.addContext(simpleContext3);
complexContext2.setJoinKey(new SimpleJoinKey(t3.field("f2")));
tuple1 = GungnirTuple.builder(
new TupleSchema("t1").field("+t1:f1").field("+t1:f3").field("+t1:f0").field("+t2:f3")
.field("+t2:f1").field("+t2:f2").field("+t3:f2").field("+t3:f1"))
.put("+t1:f1", "t1f1").put("+t1:f3", "t1f3").put("+t1:f0", "t1f0").put("+t2:f3", "t2f3")
.put("+t2:f1", "t2f1").put("+t2:f2", "t2f2").put("+t3:f2", "t3f2").put("+t3:f1", "t3f1")
.build();
assertThat(complexContext2.getFields(),
is((List<FieldAccessor>) Lists.<FieldAccessor>newArrayList(t1f1, t1f3, t2f3, t2f1, t2f2,
t3f2, t3f1)));
assertThat(complexContext2.getJoinKey(), is((JoinKey) new SimpleJoinKey(t3.field("f2"))));
assertThat(complexContext2.getOutputFields(),
is((List<FieldAccessor>) Lists.<FieldAccessor>newArrayList(t1f1, t1f3, t2f3, t2f1, t2f2,
t3f2, t3f1)));
assertThat(complexContext2.getKey(tuple1), is((Object) "t3f2"));
assertThat(complexContext2.getValues(tuple1),
is((List<Object>) Lists.<Object>newArrayList("t1f1", "t1f3", "t1f0", "t2f3", "t2f1",
"t2f2", "t3f2", "t3f1")));
SimpleJoinContext simpleContext4 = new SimpleJoinContext(t4,
Lists.<FieldAccessor>newArrayList(t4.field("f2"), t4.field("f1")));
simpleContext4.setJoinKey(new SimpleJoinKey(t4.field("f0")));
ComplexJoinContext complexContext3 = new ComplexJoinContext();
complexContext3.addContext(complexContext2);
complexContext3.addContext(simpleContext4);
complexContext3.setJoinKey(new SimpleJoinKey(t2.field("f1")));
FieldAccessor t4f2 = new FieldAccessor("+t4:f2");
FieldAccessor t4f1 = new FieldAccessor("+t4:f1");
tuple1 = GungnirTuple.builder(
new TupleSchema("t1").field("+t1:f1").field("+t1:f3").field("+t2:f3").field("+t2:f1")
.field("+t2:f2").field("+t3:f2").field("+t3:f1").field("+t4:f2").field("+t4:f1"))
.put("+t1:f1", "t1f1").put("+t1:f3", "t1f3").put("+t2:f3", "t2f3").put("+t2:f1", "t2f1")
.put("+t2:f2", "t2f2").put("+t3:f2", "t3f2").put("+t3:f1", "t3f1").put("+t4:f2", "t4f2")
.put("+t4:f1", "t4f1").build();
assertThat(complexContext3.getFields(),
is((List<FieldAccessor>) Lists.<FieldAccessor>newArrayList(t1f1, t1f3, t2f3, t2f1, t2f2,
t3f2, t3f1, t4f2, t4f1)));
assertThat(complexContext3.getJoinKey(), is((JoinKey) new SimpleJoinKey(t2.field("f1"))));
assertThat(complexContext3.getOutputFields(),
is((List<FieldAccessor>) Lists.<FieldAccessor>newArrayList(t1f1, t1f3, t2f3, t2f1, t2f2,
t3f2, t3f1, t4f2, t4f1)));
assertThat(complexContext3.getKey(tuple1), is((Object) "t2f1"));
assertThat(complexContext3.getValues(tuple1),
is((List<Object>) Lists.<Object>newArrayList("t1f1", "t1f3", "t2f3", "t2f1", "t2f2",
"t3f2", "t3f1", "t4f2", "t4f1")));
}
}