package org.reldb.rel.tests.main;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.reldb.rel.exceptions.ExceptionSemantic;
import org.reldb.rel.tests.BaseOfTest;
import org.reldb.rel.v0.storage.relvars.external.ColumnName;
import org.reldb.rel.v0.values.*;
public class TestRel extends BaseOfTest {
@Test
public void testExternalRelvarColumnRenamer() {
String source = "0abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890#!@£$%^&*()_-+=:;'\"|\\/?><.,~`±§";
String target = "_0abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890#______________________________";
assertEquals(ColumnName.cleanName(source), target);
// target length should equal source length plus 1 to allow for leading '_' because of leading '0' in source
assertEquals(target.length(), source.length() + 1);
}
@Test
public void testTrueIsTrue() {
assertValueEquals(ValueBoolean.select(generator, true), ValueBoolean.select(generator, true));
}
@Test
public void testFalseIsFalse() {
assertValueEquals(ValueBoolean.select(generator, false), ValueBoolean.select(generator, false));
}
@Test
public void testInterpretTrue() {
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate("true").getValue());
}
@Test
public void testInterpretFalse() {
assertValueEquals(ValueBoolean.select(generator, false), testEvaluate("false").getValue());
}
@Test
public void testSimpleExpression1() {
Value v1 = ValueInteger.select(generator, 4);
Value v2 = testEvaluate("3 + 4 * 2 / 8").getValue();
assertValueEquals(v1, v2);
}
@Test
public void testSimpleExpression2() {
assertValueEquals(ValueBoolean.select(generator, false), testEvaluate("3 = 4").getValue());
}
@Test
public void testSimpleExpression3() {
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate("3 < 4").getValue());
}
@Test
public void testSimpleExpression4() {
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate("3 ≤ 4").getValue());
}
@Test
public void testSimpleExpression5() {
Value v1 = ValueInteger.select(generator, 4);
Value v2 = testEvaluate("3 + 4 × 2 ÷ 8").getValue();
assertValueEquals(v1, v2);
}
@Test
public void testSimpleExpression6() {
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate("3 ≠4").getValue());
}
@Test
public void testSimpleExpression7() {
assertValueEquals(ValueBoolean.select(generator, false), testEvaluate("4 ≠4").getValue());
}
@Test
public void testSimpleVariable1() {
String src =
"BEGIN;" +
"VAR a INIT (3);" +
"END;" +
"a";
assertValueEquals(ValueInteger.select(generator, 3), testEvaluate(src).getValue());
}
@Test
public void testSimpleVariable2() {
String src =
"BEGIN;" +
"var a integer init (3);" +
"END;" +
"a";
assertValueEquals(ValueInteger.select(generator, 3), testEvaluate(src).getValue());
}
@Test
public void testSimpleVariable3() {
String src =
"BEGIN;" +
"var a integer;" +
"a := 5;" +
"END;" +
"a";
assertValueEquals(ValueInteger.select(generator, 5), testEvaluate(src).getValue());
}
@Test
public void testSimpleVariable3a() {
String src =
"BEGIN;" +
"var a int;" +
"a := 5;" +
"END;" +
"a";
assertValueEquals(ValueInteger.select(generator, 5), testEvaluate(src).getValue());
}
@Test
public void testSimpleVariable4() {
String src =
"BEGIN;" +
"var a rational;" +
"a := 5.6;" +
"END;" +
"a";
assertValueEquals(ValueRational.select(generator, 5.6), testEvaluate(src).getValue());
}
@Test
public void testSimpleVariable4a() {
String src =
"BEGIN;" +
"var a rat;" +
"a := 5.6;" +
"END;" +
"a";
assertValueEquals(ValueRational.select(generator, 5.6), testEvaluate(src).getValue());
}
@Test
public void testSimpleVariable5() {
String src =
"BEGIN;" +
"var a boolean;" +
"a := true;" +
"END;" +
"a";
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate(src).getValue());
}
@Test
public void testSimpleVariable5a() {
String src =
"BEGIN;" +
"var a bool;" +
"a := true;" +
"END;" +
"a";
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate(src).getValue());
}
@Test
public void testSimpleVariables() {
String src =
"BEGIN;" +
"var a integer;" +
"var b init (3 + 5);" +
"var c integer init (4 + 6);" +
"var d same_type_as (5 * 2);" +
"d := 2;" +
"a := 1;" +
"a := 3 + a + 4 + b + 5 + c + d;" +
"END;" +
"a";
assertValueEquals(ValueInteger.select(generator, 33), testEvaluate(src).getValue());
}
@Test
public void testEquality01() {
String src = "RELATION {TUPLE {P RELATION {TUPLE {PID \"P5\"}}}, TUPLE {P RELATION {TUPLE {PID \"P2\"}}}, TUPLE {P RELATION {TUPLE {PID \"P4\"}}}}" +
"=" +
"RELATION {TUPLE {P RELATION {TUPLE {PID \"P5\"}}}, TUPLE {P RELATION {TUPLE {PID \"P2\"}}}, TUPLE {P RELATION {TUPLE {PID \"P4\"}}}}";
testEquals("true", src);
}
@Test
public void testEquality02() {
String src =
"RELATION {" +
" TUPLE {P RELATION {TUPLE {PID \"P5\"}, TUPLE {PID \"P2\"}}}, " +
" TUPLE {P RELATION {TUPLE {PID \"P2\"}, TUPLE {PID \"P7\"}}}, " +
" TUPLE {P RELATION {TUPLE {PID \"P4\"}, TUPLE {PID \"P5\"}}}" +
"}" +
"=" +
"RELATION {" +
" TUPLE {P RELATION {TUPLE {PID \"P5\"}, TUPLE {PID \"P2\"}}}, " +
" TUPLE {P RELATION {TUPLE {PID \"P2\"}, TUPLE {PID \"P7\"}}}, " +
" TUPLE {P RELATION {TUPLE {PID \"P4\"}, TUPLE {PID \"P5\"}}}" +
"}";
testEquals("true", src);
}
@Test
public void testEquality03() {
String src =
"RELATION {" +
" TUPLE {P RELATION {TUPLE {PID \"P7\"}, TUPLE {PID \"P2\"}}}, " +
" TUPLE {P RELATION {TUPLE {PID \"P5\"}, TUPLE {PID \"P2\"}}}, " +
" TUPLE {P RELATION {TUPLE {PID \"P5\"}, TUPLE {PID \"P4\"}}}" +
"}" +
"=" +
"RELATION {" +
" TUPLE {P RELATION {TUPLE {PID \"P5\"}, TUPLE {PID \"P2\"}}}, " +
" TUPLE {P RELATION {TUPLE {PID \"P2\"}, TUPLE {PID \"P7\"}}}, " +
" TUPLE {P RELATION {TUPLE {PID \"P4\"}, TUPLE {PID \"P5\"}}}" +
"}";
testEquals("true", src);
}
@Test
public void testIf1() {
String src =
"BEGIN;" +
"var a integer;" +
"var b integer;" +
"var c integer;" +
"if 3 < 4 then " +
"a := 1;" +
"end if;" +
"if 3 < 4 then " +
"b := 10;" +
"else " +
"b := 20;" +
"end if;" +
"if 3 > 4 then " +
"c := 100;" +
"else " +
"c := 200;" +
"end if;" +
"END;" +
"a + b + c";
assertValueEquals(ValueInteger.select(generator, 211), testEvaluate(src).getValue());
}
@Test
public void testIf2() {
String src =
"BEGIN;" +
"VAR a INIT(5);" +
"var b integer;" +
"if a = 1 then " +
" b := 1;" +
"else " +
" if a = 2 then " +
" b := 2;" +
" else " +
" if a = 3 then " +
" b := 3;" +
" else " +
" b := 4;" +
" end if;" +
" end if;" +
"end if;" +
"END;" +
"b";
assertValueEquals(ValueInteger.select(generator, 4), testEvaluate(src).getValue());
}
@Test
public void testIf4() {
String src =
"if 3 < 4 then " +
"10" +
"else " +
"20" +
"end if";
assertValueEquals(ValueInteger.select(generator, 10), testEvaluate(src).getValue());
}
@Test
public void testIf5() {
String src =
"if 3 > 4 then " +
"10" +
"else " +
"20" +
"end if";
assertValueEquals(ValueInteger.select(generator, 20), testEvaluate(src).getValue());
}
@Test
public void testDoLoop() {
String src =
"BEGIN;" +
"var a integer;" +
"var i integer;" +
"DO i := 1 TO 10;" +
" a := a + 1;" +
"END DO;" +
"END;" +
"a";
assertValueEquals(ValueInteger.select(generator, 10), testEvaluate(src).getValue());
}
@Test
public void testWhileLoop() {
String src =
"BEGIN;" +
"var a integer;" +
"var i init(10);" +
"WHILE i > 0;" +
" BEGIN;" +
" a := a + 1;" +
" i := i - 1;" +
" END;" +
"END WHILE;" +
"END;" +
"a";
assertValueEquals(ValueInteger.select(generator, 10), testEvaluate(src).getValue());
}
@Test
public void testNAdicOr1() {
String src =
"or {true}";
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate(src).getValue());
}
@Test
public void testNAdicOr2() {
String src =
"or {false}";
assertValueEquals(ValueBoolean.select(generator, false), testEvaluate(src).getValue());
}
@Test
public void testNAdicOr3() {
String src =
"or {false, true}";
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate(src).getValue());
}
@Test
public void testNAdicOr4() {
String src =
"or {false, false}";
assertValueEquals(ValueBoolean.select(generator, false), testEvaluate(src).getValue());
}
@Test
public void testNAdicOr5() {
String src =
"or {false, false, true}";
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate(src).getValue());
}
@Test
public void testNAdicOr6() {
String src =
"or {}";
assertValueEquals(ValueBoolean.select(generator, false), testEvaluate(src).getValue());
}
@Test
public void testNAdicAnd1() {
String src =
"and {true}";
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate(src).getValue());
}
@Test
public void testNAdicAnd2() {
String src =
"and {false}";
assertValueEquals(ValueBoolean.select(generator, false), testEvaluate(src).getValue());
}
@Test
public void testNAdicAnd3() {
String src =
"and {false, true}";
assertValueEquals(ValueBoolean.select(generator, false), testEvaluate(src).getValue());
}
@Test
public void testNAdicAnd4() {
String src =
"and {false, false}";
assertValueEquals(ValueBoolean.select(generator, false), testEvaluate(src).getValue());
}
@Test
public void testNAdicAnd5() {
String src =
"and {false, false, true}";
assertValueEquals(ValueBoolean.select(generator, false), testEvaluate(src).getValue());
}
@Test
public void testNAdicAnd6() {
String src =
"and {true, true, true}";
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate(src).getValue());
}
@Test
public void testNAdicAnd7() {
String src =
"and {}";
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate(src).getValue());
}
@Test
public void testNAdicXor1() {
String src =
"xor {true}";
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate(src).getValue());
}
@Test
public void testNAdicXor2() {
String src =
"xor {false}";
assertValueEquals(ValueBoolean.select(generator, false), testEvaluate(src).getValue());
}
@Test
public void testNAdicXor3() {
String src =
"xor {false, true}";
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate(src).getValue());
}
@Test
public void testNAdicXor4() {
String src =
"xor {false, false}";
assertValueEquals(ValueBoolean.select(generator, false), testEvaluate(src).getValue());
}
@Test
public void testNAdicXor5() {
String src =
"xor {true, true}";
assertValueEquals(ValueBoolean.select(generator, false), testEvaluate(src).getValue());
}
@Test
public void testNAdicXor6() {
String src =
"xor {true, true, true}";
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate(src).getValue());
}
@Test
public void testNAdicXor7() {
String src =
"xor {}";
assertValueEquals(ValueBoolean.select(generator, false), testEvaluate(src).getValue());
}
@Test
public void testNadicSum1() {
String src =
"SUM {1, 2, 3, 4}";
testEquals("10", src);
}
@Test
public void testNadicSum2() {
String src =
"SUM {1.1, 2.1, 3.5, 4.4}";
testEquals("11.1", src);
}
@Test
public void testNadicSum3() {
String src =
"SUM {5}";
testEquals("5", src);
}
@Test
public void testNadicSum4() {
String src =
"SUM {}";
testEquals("0", src);
}
@Test
public void testNadicAvg1() {
String src =
"AVG {1, 2, 3, 4}";
testEquals("2.5", src);
}
@Test
public void testNadicAvg2() {
String src =
"AVG {4.3}";
testEquals("4.3", src);
}
@Test
public void testNadicMax1() {
String src =
"MAX {1, 2, 6, 3, 4}";
testEquals("6", src);
}
@Test
public void testNadicMax2() {
String src =
"MAX {4.3}";
testEquals("4.3", src);
}
@Test
public void testNadicMin1() {
String src =
"MIN {1, 2, 6, -2, 3, 4}";
testEquals("-2", src);
}
@Test
public void testNadicMin2() {
String src =
"MIN {4.3}";
testEquals("4.3", src);
}
@Test
public void testNadicCount1() {
String src =
"COUNT {1, 2, 6, -2, 3, 4}";
testEquals("6", src);
}
@Test
public void testNadicCount2() {
String src =
"COUNT {}";
testEquals("0", src);
}
@Test
public void testExactly1() {
String src =
"exactly (0)";
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate(src).getValue());
}
@Test
public void testExactly2() {
String src =
"exactly (0, false)";
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate(src).getValue());
}
@Test
public void testExactly3() {
String src =
"exactly (1, true)";
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate(src).getValue());
}
@Test
public void testExactly4() {
String src =
"exactly (1, true, false)";
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate(src).getValue());
}
@Test
public void testExactly5() {
String src =
"exactly (2, true, false, true)";
assertValueEquals(ValueBoolean.select(generator, true), testEvaluate(src).getValue());
}
@Test
public void testExactly6() {
String src =
"exactly (1)";
assertValueEquals(ValueBoolean.select(generator, false), testEvaluate(src).getValue());
}
@Test
public void testConcatenate1() {
String src =
"'blah' || 'zot'";
testEquals("\"blahzot\"", src);
}
@Test
public void testConcatenate2() {
String src =
"1.23 || 'zot'";
testEquals("\"1.23zot\"", src);
}
@Test
public void testTuple1() {
String src =
"BEGIN;" +
"var a tuple {w char, x integer, y boolean, z rational};" +
"a := tuple {w 'test', x 3, y true, z 2.5};" +
"END;" +
"a";
testEquals("TUPLE {w \"test\", x 3, y true, z 2.5}", src);
}
@Test
public void testTuple2() {
String src =
"BEGIN;" +
"var a tuple {w char, y boolean, z rational, x integer};" +
"a := tuple {x 3, w 'test', y true, z 2.5};" +
"END;" +
"a";
testEquals("TUPLE {w \"test\", y true, z 2.5, x 3}", src);
}
@Test
public void testTupleEquality1() {
String src = "TUPLE {x 'glub', y 3} = TUPLE {y 3, x 'glub'}";
testEquals("true", src);
}
@Test
public void testTupleEquality2() {
String src = "TUPLE {x 'glub', y 4} <> TUPLE {y 3, x 'glub'}";
testEquals("true", src);
}
@Test
public void testTupleRename1() {
String src =
"BEGIN;" +
"var a tuple {w char, y boolean, z rational, x integer};" +
"a := tuple {x 3, w 'test', y true, z 2.5};" +
"END;" +
"a rename {w as woggle, z as zork}";
testEquals("TUPLE {woggle \"test\", y true, zork 2.5, x 3}", src);
}
@Test
public void testTupleRename2() {
String src =
"BEGIN;" +
"var a tuple {zot_w char, zot_y boolean, zot_z rational, zot_x integer};" +
"a := tuple {zot_x 3, zot_w 'test', zot_y true, zot_z 2.5};" +
"END;" +
"a rename {prefix 'zot' as 'zap'}";
testEquals("TUPLE {zap_w \"test\", zap_y true, zap_z 2.5, zap_x 3}", src);
}
@Test
public void testTupleRename3() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zot boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zot true, z_zot 2.5};" +
"END;" +
"a rename {suffix 'zot' as 'zap'}";
testEquals("TUPLE {w_zap \"test\", y_zap true, z_zap 2.5, x_zap 3}", src);
}
@Test
public void testTupleRename4() {
String src =
"BEGIN;" +
"var a tuple {w char, y boolean, z rational, x integer};" +
"a := tuple {x 3, w 'test', y true, z 2.5};" +
"END;" +
"a rename {}";
testEquals("TUPLE {w \"test\", y true, z 2.5, x 3}", src);
}
@Test
public void testTupleProject1() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zot boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zot true, z_zot 2.5};" +
"END;" +
"a {x_zot, y_zot}";
testEquals("TUPLE {x_zot 3, y_zot true}", src);
}
@Test
public void testTupleProject2() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zot boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zot true, z_zot 2.5};" +
"END;" +
"a {y_zot, x_zot}";
testEquals("TUPLE {y_zot true, x_zot 3}", src);
}
@Test
public void testTupleProject3() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zot boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zot true, z_zot 2.5};" +
"END;" +
"a {ALL BUT y_zot, x_zot}";
testEquals("TUPLE {w_zot \"test\", z_zot 2.5}", src);
}
@Test
public void testTupleProject4() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zot boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zot true, z_zot 2.5};" +
"END;" +
"a {ALL BUT}";
testEquals("TUPLE {w_zot \"test\", y_zot true, z_zot 2.5, x_zot 3}", src);
}
@Test
public void testTupleProject5() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zot boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zot true, z_zot 2.5};" +
"END;" +
"a {}";
testEquals("TUPLE {}", src);
}
@Test
public void testTupleJoin1() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zot boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zot true, z_zot 2.5};" +
"var b tuple {w_zap char, y_zap boolean, z_zap rational, x_zap integer};" +
"b := tuple {x_zap 3, w_zap 'test', y_zap true, z_zap 2.5};" +
"END;" +
"a join b";
testEquals("TUPLE {w_zot \"test\", y_zot true, z_zot 2.5, x_zot 3, w_zap \"test\", y_zap true, z_zap 2.5, x_zap 3}", src);
}
@Test
public void testTupleJoin2() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zap boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zap true, z_zot 2.5};" +
"var b tuple {w_zap char, y_zap boolean, z_zap rational, x_zap integer};" +
"b := tuple {x_zap 3, w_zap 'test', y_zap true, z_zap 2.5};" +
"END;" +
"a join b";
testEquals("TUPLE {w_zot \"test\", y_zap true, z_zot 2.5, x_zot 3, w_zap \"test\", z_zap 2.5, x_zap 3}", src);
}
@Test
public void testTupleJoin3() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zap boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zap true, z_zot 2.5};" +
"var b tuple {};" +
"b := tuple {};" +
"END;" +
"a join b";
testEquals("TUPLE {w_zot \"test\", y_zap true, z_zot 2.5, x_zot 3}", src);
}
@Test
public void testTupleUnion1() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zot boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zot true, z_zot 2.5};" +
"var b tuple {w_zap char, y_zap boolean, z_zap rational, x_zap integer};" +
"b := tuple {x_zap 3, w_zap 'test', y_zap true, z_zap 2.5};" +
"END;" +
"a union b";
testEquals("TUPLE {w_zot \"test\", y_zot true, z_zot 2.5, x_zot 3, w_zap \"test\", y_zap true, z_zap 2.5, x_zap 3}", src);
}
@Test
public void testTupleUnion2() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zap boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zap true, z_zot 2.5};" +
"var b tuple {w_zap char, z_zap rational, y_zap boolean, x_zap integer};" +
"b := tuple {x_zap 3, w_zap 'test', y_zap true, z_zap 2.5};" +
"END;" +
"a union b";
testEquals("TUPLE {w_zot \"test\", y_zap true, z_zot 2.5, x_zot 3, w_zap \"test\", z_zap 2.5, x_zap 3}", src);
}
@Test
public void testTupleExtend1() {
String src = "extend tuple {x 3, y 2.5, z 'test'} : {a := 3 + 4, b := 'glub'}";
testEquals("TUPLE {x 3, y 2.5, z \"test\", a 7, b \"glub\"}", src);
}
@Test
public void testTupleExtend2() {
String src = "extend tuple {x 3, y 2, z 6} : {a := x + z, b := x + y}";
testEquals("TUPLE {x 3, y 2, z 6, a 9, b 5}", src);
}
@Test
public void testTupleIntersect1() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zap boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zap true, z_zot 2.5};" +
"var b tuple {w_zap char, z_zap rational, y_zap boolean, x_zap integer};" +
"b := tuple {x_zap 3, w_zap 'test', y_zap true, z_zap 2.5};" +
"END;" +
"a intersect b";
testEquals("TUPLE {y_zap true}", src);
}
@Test
public void testTupleIntersect2() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zot boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zot true, z_zot 2.5};" +
"var b tuple {w_zap char, z_zap rational, y_zap boolean, x_zap integer};" +
"b := tuple {x_zap 3, w_zap 'test', y_zap true, z_zap 2.5};" +
"END;" +
"a intersect b";
testEquals("TUPLE {}", src);
}
@Test
public void testTupleMinus1() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zap boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zap true, z_zot 2.5};" +
"var b tuple {w_zap char, z_zap rational, y_zap boolean, x_zap integer};" +
"b := tuple {x_zap 3, w_zap 'test', y_zap true, z_zap 2.5};" +
"END;" +
"a minus b";
testEquals("TUPLE {w_zot \"test\", z_zot 2.5, x_zot 3}", src);
}
@Test
public void testTupleMinus2() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zot boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zot true, z_zot 2.5};" +
"var b tuple {w_zap char, z_zap rational, y_zap boolean, x_zap integer};" +
"b := tuple {x_zap 3, w_zap 'test', y_zap true, z_zap 2.5};" +
"END;" +
"a minus b";
testEquals("TUPLE {w_zot \"test\", y_zot true, z_zot 2.5, x_zot 3}", src);
}
@Test
public void testTupleCompose1() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zot boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zot true, z_zot 2.5};" +
"var b tuple {w_zap char, y_zap boolean, z_zap rational, x_zap integer};" +
"b := tuple {x_zap 3, w_zap 'test', y_zap true, z_zap 2.5};" +
"END;" +
"a compose b";
testEquals("TUPLE {w_zot \"test\", y_zot true, z_zot 2.5, x_zot 3, w_zap \"test\", y_zap true, z_zap 2.5, x_zap 3}", src);
}
@Test
public void testTupleCompose2() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zap boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zap true, z_zot 2.5};" +
"var b tuple {w_zap char, y_zap boolean, z_zap rational, x_zap integer};" +
"b := tuple {x_zap 3, w_zap 'test', y_zap true, z_zap 2.5};" +
"END;" +
"a compose b";
testEquals("TUPLE {w_zot \"test\", z_zot 2.5, x_zot 3, w_zap \"test\", z_zap 2.5, x_zap 3}", src);
}
@Test
public void testTupleDisjointUnion1() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zot boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zot true, z_zot 2.5};" +
"var b tuple {w_zap char, y_zap boolean, z_zap rational, x_zap integer};" +
"b := tuple {x_zap 3, w_zap 'test', y_zap true, z_zap 2.5};" +
"END;" +
"a d_union b";
testEquals("TUPLE {w_zot \"test\", y_zot true, z_zot 2.5, x_zot 3, w_zap \"test\", y_zap true, z_zap 2.5, x_zap 3}", src);
}
@Test
public void testTupleSemijoin1() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zap boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zap true, z_zot 2.5};" +
"var b tuple {w_zap char, y_zap boolean, z_zap rational, x_zap integer};" +
"b := tuple {x_zap 3, w_zap 'test', y_zap true, z_zap 2.5};" +
"END;" +
"a semijoin b";
testEquals("TUPLE {y_zap true}", src);
}
@Test
public void testTupleSemijoin2() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zap boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zap true, z_zot 2.5};" +
"var b tuple {w_zap char, y_zap boolean, z_zap rational, x_zap integer};" +
"b := tuple {x_zap 3, w_zap 'test', y_zap true, z_zap 2.5};" +
"END;" +
"a matching b";
testEquals("TUPLE {y_zap true}", src);
}
@Test
public void testTupleSemiminus1() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zap boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zap true, z_zot 2.5};" +
"var b tuple {w_zap char, y_zap boolean, z_zap rational, x_zap integer};" +
"b := tuple {x_zap 3, w_zap 'test', y_zap true, z_zap 2.5};" +
"END;" +
"a semiminus b";
testEquals("TUPLE {w_zot \"test\", z_zot 2.5, x_zot 3}", src);
}
@Test
public void testTupleSemiminus2() {
String src =
"BEGIN;" +
"var a tuple {w_zot char, y_zap boolean, z_zot rational, x_zot integer};" +
"a := tuple {x_zot 3, w_zot 'test', y_zap true, z_zot 2.5};" +
"var b tuple {w_zap char, y_zap boolean, z_zap rational, x_zap integer};" +
"b := tuple {x_zap 3, w_zap 'test', y_zap true, z_zap 2.5};" +
"END;" +
"a not matching b";
testEquals("TUPLE {w_zot \"test\", z_zot 2.5, x_zot 3}", src);
}
@Test
public void testTupleSemiminus3() {
String src =
"tuple {x_zot 3, y_zap true, w_zot 'test', z_zot 2.5} semiminus tuple {x_zap 3, w_zap 'test', y_zap true, z_zap 2.5}";
testEquals("TUPLE {x_zot 3, w_zot \"test\", z_zot 2.5}", src);
}
@Test
public void testTupleWrap1() {
String src =
"tuple {x_zot 3, w_zot 'test', y_zap true, z_zot 2.5} wrap {w_zot, y_zap} as x";
testEquals("TUPLE {x_zot 3, z_zot 2.5, x TUPLE {w_zot \"test\", y_zap true}}", src);
}
@Test
public void testTupleWrap3() {
String src =
"tuple {x_zot 3, w_zot 'test', y_zap true, z_zot 2.5} wrap {ALL BUT} as x";
testEquals("TUPLE {x TUPLE {x_zot 3, w_zot \"test\", y_zap true, z_zot 2.5}}", src);
}
@Test
public void testTupleWrap4() {
String src =
"tuple {x_zot 3, w_zot 'test', y_zap true, z_zot 2.5} wrap {ALL BUT w_zot} as x";
testEquals("TUPLE {w_zot \"test\", x TUPLE {x_zot 3, y_zap true, z_zot 2.5}}", src);
}
@Test
public void testTupleUnwrap1() {
String src =
"(TUPLE {x TUPLE {w_zot \"test\", y_zap true}, y TUPLE {z_zot 2.5, x_zot 3}} unwrap x) unwrap y";
testEquals("TUPLE {w_zot \"test\", y_zap true, z_zot 2.5, x_zot 3}", src);
}
@Test
public void testTupleAttributeFrom1() {
String src =
"x FROM TUPLE {x TUPLE {w_zot \"test\", y_zap true}, y TUPLE {z_zot 2.5, x_zot 3}}";
testEquals("TUPLE {w_zot \"test\", y_zap true}", src);
}
@Test
public void testNadicUnion1() {
String src =
"UNION {tuple {x 3}}";
testEquals("TUPLE {x 3}", src);
}
@Test
public void testNadicUnion2() {
String src =
"UNION {tuple {x 3}, tuple {y 4.5}}";
testEquals("TUPLE {x 3, y 4.5}", src);
}
@Test
public void testNadicUnion3() {
String src =
"UNION {tuple {x 3}, tuple {y 4.5}, tuple {z \"test\"}}";
testEquals("TUPLE {x 3, y 4.5, z \"test\"}", src);
}
@Test
public void testNadicXunion1() {
String src =
"XUNION {tuple {x 3}}";
testEquals("TUPLE {x 3}", src);
}
@Test
public void testNadicXunion2() {
String src =
"XUNION {tuple {x 3}, tuple {y 4.5}}";
testEquals("TUPLE {x 3, y 4.5}", src);
}
@Test
public void testNadicXunion3() {
String src =
"XUNION {tuple {a 1, x 3}, tuple {x 3, b 2}, tuple {x 3, z \"test\"}}";
testEquals("TUPLE {a 1, x 3, b 2, z \"test\"}", src);
}
@Test
public void testNadicDUnion1() {
String src =
"D_UNION {tuple {x 3}}";
testEquals("TUPLE {x 3}", src);
}
@Test
public void testNadicDUnion2() {
String src =
"D_UNION {tuple {x 3}, tuple {y 4.5}}";
testEquals("TUPLE {x 3, y 4.5}", src);
}
@Test
public void testNadicDUnion3() {
String src =
"D_UNION {tuple {x 3}, tuple {y 4.5}, tuple {z \"test\"}}";
testEquals("TUPLE {x 3, y 4.5, z \"test\"}", src);
}
@Test
public void testNadicIntersect1() {
String src =
"INTERSECT {tuple {x 3, y 4}, tuple {x 3, z 7}, tuple {x 3, q 2.5}, tuple {x 3, p 1}}";
testEquals("TUPLE {x 3}", src);
}
@Test
public void testNadicIntersect2() {
String src =
"INTERSECT {tuple {x 3, y 4}, tuple {p 1, x 3}, tuple {x 3, z 7}}";
testEquals("TUPLE {x 3}", src);
}
@Test
public void testNadicJoin1() {
String src =
"JOIN {}";
testEquals("RELATION {} {\n\tTUPLE {}\n}", src);
}
@Test
public void testNadicJoin2() {
String src =
"JOIN {tuple {x 3}}";
testEquals("TUPLE {x 3}", src);
}
@Test
public void testNadicJoin3() {
String src =
"JOIN {tuple {x 3}, tuple {y 4.5}}";
testEquals("TUPLE {x 3, y 4.5}", src);
}
@Test
public void testNadicJoin4() {
String src =
"JOIN {tuple {x 3}, tuple {y 4.5}, tuple {z \"test\"}}";
testEquals("TUPLE {x 3, y 4.5, z \"test\"}", src);
}
@Test
public void testNadicTimes1() {
String src =
"TIMES {}";
testEquals("RELATION {} {\n\tTUPLE {}\n}", src);
}
@Test
public void testNadicTimes2() {
String src =
"TIMES {tuple {x 3}}";
testEquals("TUPLE {x 3}", src);
}
@Test
public void testNadicTimes3() {
String src =
"TIMES {tuple {x 3}, tuple {y 4.5}}";
testEquals("TUPLE {x 3, y 4.5}", src);
}
@Test
public void testNadicTimes4() {
String src =
"TIMES {tuple {x 3}, tuple {y 4.5}, tuple {z \"test\"}}";
testEquals("TUPLE {x 3, y 4.5, z \"test\"}", src);
}
@Test
public void testNadicCompose1() {
String src =
"COMPOSE {}";
testEquals("RELATION {} {\n\tTUPLE {}\n}", src);
}
@Test
public void testNadicCompose2() {
String src =
"COMPOSE {tuple {x 3}}";
testEquals("TUPLE {x 3}", src);
}
@Test
public void testNadicCompose3() {
String src =
"COMPOSE {tuple {x 3}, tuple {y 4.5}}";
testEquals("TUPLE {x 3, y 4.5}", src);
}
@Test
public void testNadicCompose4() {
String src =
"COMPOSE {tuple {x 3}, tuple {y 4.5}, tuple {z \"test\"}}";
testEquals("TUPLE {x 3, y 4.5, z \"test\"}", src);
}
@Test
public void testNadicOps1() {
String src = "JOIN {} = DEE";
testEquals("true", src);
}
@Test
public void testNadicOps2() {
String src = "TIMES {} = DEE";
testEquals("true", src);
}
@Test
public void testNadicOps3() {
String src = "COMPOSE {} = DEE";
testEquals("true", src);
}
@Test
public void testNadicOps4() {
String src = "XUNION {} = TUPLE {}";
testEquals("true", src);
}
@Test
public void testNadicOps5() {
String src = "D_UNION {} = TUPLE {}";
testEquals("true", src);
}
@Test
public void testNadicOps6() {
String src = "UNION {} = TUPLE {}";
testEquals("true", src);
}
@Test
public void testNadicOps7() {
String src = "XUNION {} {} = DUM";
testEquals("true", src);
}
@Test
public void testNadicOps8() {
String src = "D_UNION {} {} = DUM";
testEquals("true", src);
}
@Test
public void testNadicOps9() {
String src = "UNION {} {} = DUM";
testEquals("true", src);
}
@Test
public void testNadicOps10() {
String src = "INTERSECT {}";
String expected =
"RS0114: Expression list for n-adic INTERSECT cannot be empty.\n" +
"Line 1\n\n";
try {
testEquals(expected, src);
} catch (ExceptionSemantic es) {
assertEquals(expected, es.getMessage().substring(0, expected.length()));
}
}
@Test
public void testNadicOps11() {
String src = "INTERSECT {} {}";
String expected =
"RS0114: Expression list for n-adic INTERSECT cannot be empty.\n" +
"Line 1\n\n";
try {
testEquals(expected, src);
} catch (ExceptionSemantic es) {
assertEquals(expected, es.getMessage().substring(0, expected.length()));
}
}
@Test
public void testRelationUpdateExpression1() {
String src =
"UPDATE relation {tuple {x 3, y 4.5, z \"test\"}, tuple {x 2, y 4.5, z \"test\"}} : {y := 2.2, z := \"glub\"}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 2.2, z \"glub\"},\n\tTUPLE {x 2, y 2.2, z \"glub\"}\n}", src);
}
@Test
public void testRelationUpdateExpression2() {
String src =
"UPDATE relation {tuple {x 3, y 4.5, z \"test\"}, tuple {x 2, y 4.5, z \"test\"}} : {x := 2, z := \"glub\"}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 2, y 4.5, z \"glub\"}\n}", src);
}
@Test
public void testTupleUpdateExpression1() {
String src =
"UPDATE tuple {x 3, y 4.5, z \"test\"} : {x := 2, z := \"glub\"}";
testEquals("TUPLE {x 2, y 4.5, z \"glub\"}", src);
}
@Test
public void testTupleUpdateExpression2() {
String src =
"UPDATE tuple {x 3, y 4.5, z \"test\"} : {x := x + 1}";
testEquals("TUPLE {x 4, y 4.5, z \"test\"}", src);
}
@Test
public void testTupleUpdateStatement1() {
String src =
"BEGIN;" +
"VAR a INIT(tuple {x 3, y 4.5, z \"test\"});" +
"UPDATE a : {x := x + 1, z := \"glub\"};" +
"END;" +
"a";
testEquals("TUPLE {x 4, y 4.5, z \"glub\"}", src);
}
@Test
public void testSameTypeAs1() {
String src =
"BEGIN;" +
"VAR a INIT(tuple {x 3, y 4.5, z \"test\"});" +
"VAR b INIT(tuple {q 5, y 4.5, z \"test\"});" +
"VAR c SAME_TYPE_AS (a INTERSECT b);" +
"c := TUPLE {y 2.2, z \"glub\"};" +
"END;" +
"c";
testEquals("TUPLE {y 2.2, z \"glub\"}", src);
}
@Test
public void testSameHeadingAs1() {
String src =
"BEGIN;" +
"VAR a INIT(tuple {x 3, y 4.5, z \"test\"});" +
"VAR b INIT(tuple {q 5, y 4.5, z \"test\"});" +
"VAR c TUPLE SAME_HEADING_AS (a INTERSECT b);" +
"c := TUPLE {y 2.2, z \"glub\"};" +
"END;" +
"c";
testEquals("TUPLE {y 2.2, z \"glub\"}", src);
}
@Test
public void testRelation1() {
String src =
"TABLE_DUM";
testEquals("RELATION {} {\n}", src);
}
@Test
public void testRelation2() {
String src =
"TABLE_DEE";
testEquals("RELATION {} {\n\tTUPLE {}\n}", src);
}
@Test
public void testRelation3() {
String src =
"BEGIN;" +
"VAR a PRIVATE RELATION {w char, x integer, y boolean, z rational} KEY {ALL BUT};" +
"a := RELATION {" +
" TUPLE {w 'test', x 3, y true, z 2.5}, " +
" TUPLE {w 'glub', x 5, y false, z 3.5}" +
"};" +
"END;" +
"a";
testEquals("RELATION {w CHARACTER, x INTEGER, y BOOLEAN, z RATIONAL} {\n\tTUPLE {w \"glub\", x 5, y false, z 3.5},\n\tTUPLE {w \"test\", x 3, y true, z 2.5}\n}", src);
}
@Test
public void testRelation3a() {
String src =
"BEGIN;" +
"VAR a PRIVATE REL {w char, x integer, y boolean, z rational} KEY {ALL BUT};" +
"a := REL {" +
" TUP {w 'test', x 3, y true, z 2.5}, " +
" TUP {w 'glub', x 5, y false, z 3.5}" +
"};" +
"END;" +
"a";
testEquals("RELATION {w CHARACTER, x INTEGER, y BOOLEAN, z RATIONAL} {\n\tTUPLE {w \"glub\", x 5, y false, z 3.5},\n\tTUPLE {w \"test\", x 3, y true, z 2.5}\n}", src);
}
@Test
public void testRelation4() {
String src =
"BEGIN;" +
"VAR a PRIVATE RELATION {w char, x integer, y boolean, z rational} KEY {ALL BUT};" +
"a := RELATION {" +
" TUPLE {w 'test', x 3, y true, z 2.5}, " +
" TUPLE {y false, z 3.5, x 5, w 'glub'}" +
"};" +
"END;" +
"a";
testEquals("RELATION {w CHARACTER, x INTEGER, y BOOLEAN, z RATIONAL} {\n\tTUPLE {w \"glub\", x 5, y false, z 3.5},\n\tTUPLE {w \"test\", x 3, y true, z 2.5}\n}", src);
}
@Test
public void testRelation5() {
String src =
"BEGIN;" +
"VAR a PRIVATE RELATION {w char, x integer, y boolean, z rational} KEY {ALL BUT};" +
"a := RELATION {" +
" TUPLE {w 'test', x 3, y true, z 2.5}," +
" TUPLE {y false, z 3.5, x 5, w 'glub'}," +
" TUPLE {y false, z 3.5, x 5, w 'glub'}" +
"};" +
"END;" +
"a";
testEquals("RELATION {w CHARACTER, x INTEGER, y BOOLEAN, z RATIONAL} {\n\tTUPLE {w \"glub\", x 5, y false, z 3.5},\n\tTUPLE {w \"test\", x 3, y true, z 2.5}\n}", src);
}
@Test
public void testRelation6() {
String src =
"BEGIN;" +
"VAR a PRIVATE RELATION {w char, x integer, y boolean, z rational} KEY {ALL BUT};" +
"a := RELATION {" +
" TUPLE {w 'test', x 3, y true, z 2.5}, " +
" TUPLE {y false, z 3.5, x 5, w 'glub'}," +
" TUPLE {z 3.5, w 'glub', y false, x 5}" +
"};" +
"END;" +
"a";
testEquals("RELATION {w CHARACTER, x INTEGER, y BOOLEAN, z RATIONAL} {\n\tTUPLE {w \"glub\", x 5, y false, z 3.5},\n\tTUPLE {w \"test\", x 3, y true, z 2.5}\n}", src);
}
@Test
public void testRelation7() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT (RELATION {w char, x integer, y boolean, z rational} " +
"{" +
" TUPLE {w 'test', x 3, y true, z 2.5}, " +
" TUPLE {y false, z 3.5, x 5, w 'glub'}," +
" TUPLE {z 3.5, w 'glub', y false, x 5}" +
"}) KEY {ALL BUT};" +
"END;" +
"a";
testEquals("RELATION {w CHARACTER, x INTEGER, y BOOLEAN, z RATIONAL} {\n\tTUPLE {w \"glub\", x 5, y false, z 3.5},\n\tTUPLE {w \"test\", x 3, y true, z 2.5}\n}", src);
}
@Test
public void testRelation8() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT (RELATION {" +
" TUPLE {w 'test', x 3, y true, z 2.5}, " +
" TUPLE {y false, z 3.5, x 5, w 'glub'}," +
" TUPLE {z 3.5, w 'glub', y false, x 5}" +
"}) KEY {ALL BUT};" +
"END;" +
"a";
testEquals("RELATION {w CHARACTER, x INTEGER, y BOOLEAN, z RATIONAL} {\n\tTUPLE {w \"glub\", x 5, y false, z 3.5},\n\tTUPLE {w \"test\", x 3, y true, z 2.5}\n}", src);
}
@Test
public void testRelation9() {
String src =
"relation {" +
"tuple {w_zot relation {tuple {a 1, b 'x'}, tuple {a 2, b 'y'}}, x_zot 3}," +
"tuple {x_zot 4, w_zot relation {tuple {b 'z', a 5}, tuple {b 'y', a 2}}}" +
"}";
String result = "RELATION {w_zot RELATION {a INTEGER, b CHARACTER}, x_zot INTEGER} {" +
"\n\tTUPLE {w_zot RELATION {a INTEGER, b CHARACTER} {" +
"\n\tTUPLE {a 1, b \"x\"}," +
"\n\tTUPLE {a 2, b \"y\"}" +
"\n}, x_zot 3}," +
"\n\tTUPLE {w_zot RELATION {a INTEGER, b CHARACTER} {" +
"\n\tTUPLE {a 5, b \"z\"}," +
"\n\tTUPLE {a 2, b \"y\"}" +
"\n}, x_zot 4}" +
"\n}";
testEquals(result, src);
}
@Test
public void testRelation10() {
String src =
"BEGIN;" +
"var a private relation {w_zot relation {a integer, b char}, x_zot integer} key {all but};" +
"a := relation {" +
"tuple {w_zot relation {tuple {a 1, b 'x'}, tuple {b 'y', a 2}}, x_zot 3}," +
"tuple {x_zot 4, w_zot relation {tuple {b 'z', a 5}, tuple {b 'y', a 2}}}" +
"};" +
"END;" +
"a";
String result = "RELATION {w_zot RELATION {a INTEGER, b CHARACTER}, x_zot INTEGER} {" +
"\n\tTUPLE {w_zot RELATION {a INTEGER, b CHARACTER} {" +
"\n\tTUPLE {a 1, b \"x\"}," +
"\n\tTUPLE {a 2, b \"y\"}" +
"\n}, x_zot 3}," +
"\n\tTUPLE {w_zot RELATION {a INTEGER, b CHARACTER} {" +
"\n\tTUPLE {a 5, b \"z\"}," +
"\n\tTUPLE {a 2, b \"y\"}" +
"\n}, x_zot 4}" +
"\n}";
testEquals(result, src);
}
@Test
public void testRelation11() {
String src =
"relation {" +
"tuple {w_zot relation {tuple {a 1, b 'x'}}, x_zot 3}," +
"tuple {x_zot 4, w_zot relation {tuple {b 'z', a 5}}}" +
"}";
String result = "RELATION {w_zot RELATION {a INTEGER, b CHARACTER}, x_zot INTEGER} {" +
"\n\tTUPLE {w_zot RELATION {a INTEGER, b CHARACTER} {" +
"\n\tTUPLE {a 1, b \"x\"}" +
"\n}, x_zot 3}," +
"\n\tTUPLE {w_zot RELATION {a INTEGER, b CHARACTER} {" +
"\n\tTUPLE {a 5, b \"z\"}" +
"\n}, x_zot 4}" +
"\n}";
testEquals(result, src);
}
@Test
public void testRelation12() {
String src =
"relation {" +
"tuple {w_zot relation {tuple {a 1, b 'x'}}}," +
"tuple {w_zot relation {tuple {b 'z', a 5}}}" +
"}";
String result = "RELATION {w_zot RELATION {a INTEGER, b CHARACTER}} {" +
"\n\tTUPLE {w_zot RELATION {a INTEGER, b CHARACTER} {" +
"\n\tTUPLE {a 1, b \"x\"}" +
"\n}}," +
"\n\tTUPLE {w_zot RELATION {a INTEGER, b CHARACTER} {" +
"\n\tTUPLE {a 5, b \"z\"}" +
"\n}}" +
"\n}";
testEquals(result, src);
}
@Test
public void testRelation13() {
String src =
"RELATION {w char, x integer, y boolean, z rational} " +
"{" +
" TUPLE {w 'test', x 3, y true, z 2.5}, " +
" TUPLE {y false, z 3.5, x 5, w 'glub'}," +
" TUPLE {z 3.5, w 'glub', y false, x 5}" +
"}";
testEquals("RELATION {w CHARACTER, x INTEGER, y BOOLEAN, z RATIONAL} {\n\tTUPLE {w \"test\", x 3, y true, z 2.5},\n\tTUPLE {w \"glub\", x 5, y false, z 3.5}\n}", src);
}
@Test
public void testSameHeadingAs2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {tuple {x 3, y 4.5, z \"test\"}}) KEY {ALL BUT};" +
"VAR c TUPLE SAME_HEADING_AS (a);" +
"c := TUPLE {y 2.2, z \"glub\", x 2};" +
"END;" +
"c";
testEquals("TUPLE {x 2, y 2.2, z \"glub\"}", src);
}
@Test
public void testRelationProject1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}" +
"}) KEY {ALL BUT};" +
"END;" +
"a {x}";
testEquals("RELATION {x INTEGER} {\n\tTUPLE {x 3}\n}", src);
}
@Test
public void testRelationProject2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {x 3, y 2.8, z \"glob\"}" +
"}) KEY {ALL BUT};" +
"END;" +
"a {x}";
testEquals("RELATION {x INTEGER} {\n\tTUPLE {x 3}\n}", src);
}
@Test
public void testRelationProject3() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 3, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a {x}";
testEquals("RELATION {x INTEGER} {\n\tTUPLE {x 3}\n}", src);
}
@Test
public void testRelationProject4() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 3, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a {ALL BUT}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {" +
"\n\tTUPLE {x 3, y 2.8, z \"glob\"}," +
"\n\tTUPLE {x 3, y 4.5, z \"test\"}" +
"\n}", src);
}
@Test
public void testRelationProject5() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 3, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a {ALL BUT x}";
testEquals("RELATION {y RATIONAL, z CHARACTER} {" +
"\n\tTUPLE {y 2.8, z \"glob\"}," +
"\n\tTUPLE {y 4.5, z \"test\"}" +
"\n}", src);
}
@Test
public void testRelationUnion1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 3, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 3, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a UNION b";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 2.8, z \"glob\"},\n\tTUPLE {x 3, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testRelationUnion2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 4, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a UNION b";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 4.5, z \"test\"},\n\tTUPLE {x 6, y 2.8, z \"glob\"},\n\tTUPLE {x 4, y 2.8, z \"glob\"},\n\tTUPLE {x 5, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testRelationXunion1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 3, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 3, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a XUNION b";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n}", src);
}
@Test
public void testRelationXunion2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a XUNION b";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 4.5, z \"test\"},\n\tTUPLE {x 5, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testRelationDUnion1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 4, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a D_UNION b";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 4.5, z \"test\"},\n\tTUPLE {x 6, y 2.8, z \"glob\"},\n\tTUPLE {x 4, y 2.8, z \"glob\"},\n\tTUPLE {x 5, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testRelationIntersect1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 4, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a INTERSECT b";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n}", src);
}
@Test
public void testRelationIntersect2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, y 4.5, z \"test\"}," +
" tuple {z \"test\", x 3, y 4.5}" +
"}) KEY {ALL BUT};" +
"END;" +
"a INTERSECT b";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testRelationMinus1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 4, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a MINUS b";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 4.5, z \"test\"},\n\tTUPLE {x 6, y 2.8, z \"glob\"}\n}", src);
}
@Test
public void testRelationMinus2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, y 4.5, z \"test\"}," +
" tuple {z \"test\", x 3, y 4.5}" +
"}) KEY {ALL BUT};" +
"END;" +
"a MINUS b";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 6, y 2.8, z \"glob\"}\n}", src);
}
@Test
public void testRelationIMinus1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a I_MINUS b";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testRelationJoin1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5}," +
" tuple {x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}," +
" tuple {a 4.6, b 9}" +
"}) KEY {ALL BUT};" +
"END;" +
"a JOIN b";
testEquals("RELATION {x INTEGER, y RATIONAL, a RATIONAL, b INTEGER} {\n\tTUPLE {x 3, y 4.5, a 4.5, b 7},\n\tTUPLE {x 3, y 4.5, a 4.6, b 9},\n\tTUPLE {x 3, y 4.5, a 4.8, b 8},\n\tTUPLE {x 6, y 2.8, a 4.5, b 7},\n\tTUPLE {x 6, y 2.8, a 4.6, b 9},\n\tTUPLE {x 6, y 2.8, a 4.8, b 8}\n}", src);
}
@Test
public void testRelationJoin2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DUM) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a JOIN b";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n}", src);
}
@Test
public void testRelationJoin3() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DUM) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"b JOIN a";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n}", src);
}
@Test
public void testRelationJoin4() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DEE) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"b JOIN a";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n\tTUPLE {a 4.5, b 7},\n\tTUPLE {a 4.8, b 8}\n}", src);
}
@Test
public void testRelationJoin5() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DEE) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a JOIN b";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n\tTUPLE {a 4.5, b 7},\n\tTUPLE {a 4.8, b 8}\n}", src);
}
@Test
public void testRelationJoin6() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, a 4.5, b \"test\"}," +
" tuple {b \"zot\", x 3, a 4.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a JOIN b";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER, a RATIONAL, b CHARACTER} {\n\tTUPLE {x 3, y 4.5, z \"test\", a 4.8, b \"zot\"}\n}", src);
}
@Test
public void testRelationTimes1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5}," +
" tuple {x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}," +
" tuple {a 4.6, b 9}" +
"}) KEY {ALL BUT};" +
"END;" +
"a TIMES b";
testEquals("RELATION {x INTEGER, y RATIONAL, a RATIONAL, b INTEGER} {\n\tTUPLE {x 3, y 4.5, a 4.5, b 7},\n\tTUPLE {x 3, y 4.5, a 4.6, b 9},\n\tTUPLE {x 3, y 4.5, a 4.8, b 8},\n\tTUPLE {x 6, y 2.8, a 4.5, b 7},\n\tTUPLE {x 6, y 2.8, a 4.6, b 9},\n\tTUPLE {x 6, y 2.8, a 4.8, b 8}\n}", src);
}
@Test
public void testRelationTimes2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DUM) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a TIMES b";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n}", src);
}
@Test
public void testRelationTimes3() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DUM) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"b TIMES a";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n}", src);
}
@Test
public void testRelationTimes4() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DEE) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"b TIMES a";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n\tTUPLE {a 4.5, b 7},\n\tTUPLE {a 4.8, b 8}\n}", src);
}
@Test
public void testRelationTimes5() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DEE) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a TIMES b";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n\tTUPLE {a 4.5, b 7},\n\tTUPLE {a 4.8, b 8}\n}", src);
}
@Test
public void testRelationCompose1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5}," +
" tuple {x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}," +
" tuple {a 4.6, b 9}" +
"}) KEY {ALL BUT};" +
"END;" +
"a COMPOSE b";
testEquals("RELATION {x INTEGER, y RATIONAL, a RATIONAL, b INTEGER} {\n\tTUPLE {x 3, y 4.5, a 4.5, b 7},\n\tTUPLE {x 3, y 4.5, a 4.6, b 9},\n\tTUPLE {x 3, y 4.5, a 4.8, b 8},\n\tTUPLE {x 6, y 2.8, a 4.5, b 7},\n\tTUPLE {x 6, y 2.8, a 4.6, b 9},\n\tTUPLE {x 6, y 2.8, a 4.8, b 8}\n}", src);
}
@Test
public void testRelationCompose2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DUM) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a COMPOSE b";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n}", src);
}
@Test
public void testRelationCompose3() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DUM) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"b COMPOSE a";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n}", src);
}
@Test
public void testRelationCompose4() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DEE) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"b COMPOSE a";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n\tTUPLE {a 4.5, b 7},\n\tTUPLE {a 4.8, b 8}\n}", src);
}
@Test
public void testRelationCompose5() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DEE) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a COMPOSE b";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n\tTUPLE {a 4.5, b 7},\n\tTUPLE {a 4.8, b 8}\n}", src);
}
@Test
public void testRelationCompose6() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, a 4.5, b \"test\"}," +
" tuple {b \"zot\", x 3, a 4.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a COMPOSE b";
testEquals("RELATION {y RATIONAL, z CHARACTER, a RATIONAL, b CHARACTER} {\n\tTUPLE {y 4.5, z \"test\", a 4.8, b \"zot\"}\n}", src);
}
@Test
public void testRelationSemijoin1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5}," +
" tuple {x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}," +
" tuple {a 4.6, b 9}" +
"}) KEY {ALL BUT};" +
"END;" +
"a MATCHING b";
testEquals("RELATION {x INTEGER, y RATIONAL} {\n\tTUPLE {x 3, y 4.5},\n\tTUPLE {x 6, y 2.8}\n}", src);
}
@Test
public void testRelationSemijoin2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DUM) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a MATCHING b";
testEquals("RELATION {} {\n}", src);
}
@Test
public void testRelationSemijoin3() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DUM) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"b MATCHING a";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n}", src);
}
@Test
public void testRelationSemijoin4() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DEE) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"b MATCHING a";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n\tTUPLE {a 4.5, b 7},\n\tTUPLE {a 4.8, b 8}\n}", src);
}
@Test
public void testRelationSemijoin5() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DEE) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a MATCHING b";
testEquals("RELATION {} {\n\tTUPLE {}\n}", src);
}
@Test
public void testRelationSemijoin6() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, a 4.5, b \"test\"}," +
" tuple {b \"zot\", x 3, a 4.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a MATCHING b";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testRelationSemiminus1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5}," +
" tuple {x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}," +
" tuple {a 4.6, b 9}" +
"}) KEY {ALL BUT};" +
"END;" +
"a NOT MATCHING b";
testEquals("RELATION {x INTEGER, y RATIONAL} {\n}", src);
}
@Test
public void testRelationSemiminus2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DUM) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a NOT MATCHING b";
testEquals("RELATION {} {\n}", src);
}
@Test
public void testRelationSemiminus3() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DUM) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"b NOT MATCHING a";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n\tTUPLE {a 4.5, b 7},\n\tTUPLE {a 4.8, b 8}\n}", src);
}
@Test
public void testRelationSemiminus4() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DEE) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"b NOT MATCHING a";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n}", src);
}
@Test
public void testRelationSemiminus5() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DEE) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a NOT MATCHING b";
testEquals("RELATION {} {\n}", src);
}
@Test
public void testRelationSemiminus6() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, a 4.5, b \"test\"}," +
" tuple {b \"zot\", x 3, a 4.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"a NOT MATCHING b";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 6, y 2.8, z \"glob\"}\n}", src);
}
@Test
public void testRelationExtend1() {
String src = "extend relation {tuple {x 3, y 2.5, z 'test'}} : {a := 3 + 4, b := 'glub'}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER, a INTEGER, b CHARACTER} {\n\tTUPLE {x 3, y 2.5, z \"test\", a 7, b \"glub\"}\n}", src);
}
@Test
public void testRelationExtend2() {
String src = "extend relation {tuple {x 3, y 2, z 6}} : {a := x + z, b := x + y}";
testEquals("RELATION {x INTEGER, y INTEGER, z INTEGER, a INTEGER, b INTEGER} {\n\tTUPLE {x 3, y 2, z 6, a 9, b 5}\n}", src);
}
@Test
public void testRelationExtend3() {
String src = "extend relation {tuple {x 3, y 2.5, z 'test'}, tuple {y 7.1, z 'zot', x 5}} : {a := 3 + 4, b := 'glub'}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER, a INTEGER, b CHARACTER} {\n\tTUPLE {x 3, y 2.5, z \"test\", a 7, b \"glub\"},\n\tTUPLE {x 5, y 7.1, z \"zot\", a 7, b \"glub\"}\n}", src);
}
@Test
public void testRelationExtend4() {
String src = "extend relation {tuple {x 3, y 2, z 6}, tuple {y 7, z 1, x 5}} : {a := x + z, b := x + y}";
testEquals("RELATION {x INTEGER, y INTEGER, z INTEGER, a INTEGER, b INTEGER} {\n\tTUPLE {x 3, y 2, z 6, a 9, b 5},\n\tTUPLE {x 5, y 7, z 1, a 6, b 12}\n}", src);
}
@Test
public void testRelationWrap1() {
String src =
"relation {tuple {x_zot 3, w_zot 'test', y_zap true, z_zot 2.5}} wrap {w_zot, y_zap} as x";
testEquals("RELATION {x_zot INTEGER, z_zot RATIONAL, x TUPLE {w_zot CHARACTER, y_zap BOOLEAN}} {\n\tTUPLE {x_zot 3, z_zot 2.5, x TUPLE {w_zot \"test\", y_zap true}}\n}", src);
}
@Test
public void testRelationUnwrap1() {
String src =
"(RELATION {TUPLE {x TUPLE {w_zot \"test\", y_zap true}, y TUPLE {z_zot 2.5, x_zot 3}}} unwrap x) unwrap y";
testEquals("RELATION {w_zot CHARACTER, y_zap BOOLEAN, z_zot RATIONAL, x_zot INTEGER} {\n\tTUPLE {w_zot \"test\", y_zap true, z_zot 2.5, x_zot 3}\n}", src);
}
@Test
public void testRelationFrom() {
String src =
"TUPLE FROM RELATION {TUPLE {z_zot 2.5, x_zot 3}}";
testEquals("TUPLE {z_zot 2.5, x_zot 3}", src);
}
@Test
public void testTupleIn1() {
String src = "TUPLE {x 'glub', y 3} IN RELATION {" +
" TUPLE {y 3, x 'glub'}," +
" TUPLE {x 'glob', y 7}" +
"}";
testEquals("true", src);
}
@Test
public void testTupleIn2() {
String src = "TUPLE {x 'glub', y 3} IN RELATION {" +
" TUPLE {y 4, x 'glub'}," +
" TUPLE {x 'glob', y 7}" +
"}";
testEquals("false", src);
}
@Test
public void testTupleIn3() {
String src = "TUPLE {y 3, x 'glub'} IN RELATION {" +
" TUPLE {x 'glub', y 3}," +
" TUPLE {x 'glob', y 7}" +
"}";
testEquals("true", src);
}
@Test
public void testTupleIn4() {
String src = "TUPLE {Flump \"Dave\", Poople 3, Blimp true} IN RELATION {" +
" TUPLE {Blimp true, Flump \"Dave\", Poople 3}," +
" TUPLE {Blimp true, Flump \"Calvin\", Poople 7}," +
" TUPLE {Blimp false, Flump \"Indi\", Poople 8}" +
"}";
testEquals("true", src);
}
@Test
public void testRelationWhere1() {
String src =
"RELATION {TUPLE {z_zot 2.5, x_zot 3}, TUPLE {z_zot 2.6, x_zot 5}} WHERE x_zot = 3";
testEquals("RELATION {z_zot RATIONAL, x_zot INTEGER} {\n\tTUPLE {z_zot 2.5, x_zot 3}\n}", src);
}
@Test
public void testRelationWhere2() {
String src =
"RELATION {TUPLE {z_zot 2.5, x_zot 3}, TUPLE {z_zot 2.6, x_zot 5}} WHERE x_zot = 3 AND z_zot > 2.0";
testEquals("RELATION {z_zot RATIONAL, x_zot INTEGER} {\n\tTUPLE {z_zot 2.5, x_zot 3}\n}", src);
}
@Test
public void testRelationWhere3() {
String src =
"RELATION {TUPLE {z_zot 2.5, x_zot 3}, TUPLE {z_zot 2.6, x_zot 5}} WHERE x_zot = 3 AND z_zot < 2.0";
testEquals("RELATION {z_zot RATIONAL, x_zot INTEGER} {\n}", src);
}
@Test
public void testWith1() {
String src =
"WITH (a := RELATION {TUPLE {z_zot 2.5, x_zot 3}}, b := RELATION {TUPLE {z_zot 2.6, x_zot 5}}) : a union b";
testEquals("RELATION {z_zot RATIONAL, x_zot INTEGER} {\n\tTUPLE {z_zot 2.5, x_zot 3},\n\tTUPLE {z_zot 2.6, x_zot 5}\n}", src);
}
@Test
public void testWith2() {
String src = "WITH (a := 3, b := 5) : a + b";
String expectedResult = "8";
testEquals(expectedResult, src);
}
@Test
public void testRelComp1() {
String src = "RELATION {" +
" TUPLE {q 300, s 's2', p 'p1'}," +
" TUPLE {s 's2', p 'p2', q 400}," +
" TUPLE {s 's3', p 'p2', q 200}} = " +
"RELATION {" +
" TUPLE {p 'p2', s 's2', q 400}," +
" TUPLE {p 'p1', s 's2', q 300}," +
" TUPLE {s 's3', p 'p2', q 200}}";
testEquals("true", src);
}
@Test
public void testRelComp2() {
String src = "RELATION {" +
" TUPLE {q 300, s 's2', p 'p1'}," +
" TUPLE {s 's2', p 'p2', q 400}," +
" TUPLE {s 's3', p 'p2', q 200}} <> " +
"RELATION {" +
" TUPLE {p 'p2', s 's2', q 400}," +
" TUPLE {p 'p1', s 's2', q 300}," +
" TUPLE {s 's3', p 'p2', q 200}}";
testEquals("false", src);
}
@Test
public void testRelComp3() {
String src = "RELATION {" +
" TUPLE {q 300, s 's2', p 'p1'}," +
" TUPLE {s 's2', p 'p2', q 400}," +
" TUPLE {s 's3', p 'p2', q 200}} < " +
"RELATION {" +
" TUPLE {p 'p2', s 's2', q 400}," +
" TUPLE {p 'p1', s 's2', q 300}," +
" TUPLE {s 's3', p 'p2', q 200}}";
testEquals("false", src);
}
@Test
public void testRelComp4() {
String src = "RELATION {" +
" TUPLE {q 300, s 's2', p 'p1'}," +
" TUPLE {s 's3', p 'p2', q 200}} < " +
"RELATION {" +
" TUPLE {p 'p2', s 's2', q 400}," +
" TUPLE {p 'p1', s 's2', q 300}," +
" TUPLE {s 's3', p 'p2', q 200}}";
testEquals("true", src);
}
@Test
public void testRelComp4a() {
String src = "RELATION {" +
" TUPLE {q 300, s 's2', p 'p1'}," +
" TUPLE {s 's3', p 'p2', q 200}} ⊂ " +
"RELATION {" +
" TUPLE {p 'p2', s 's2', q 400}," +
" TUPLE {p 'p1', s 's2', q 300}," +
" TUPLE {s 's3', p 'p2', q 200}}";
testEquals("true", src);
}
@Test
public void testRelComp5() {
String src = "RELATION {" +
" TUPLE {q 300, s 's2', p 'p1'}," +
" TUPLE {s 's2', p 'p2', q 400}," +
" TUPLE {s 's3', p 'p2', q 200}} <= " +
"RELATION {" +
" TUPLE {p 'p2', s 's2', q 400}," +
" TUPLE {p 'p1', s 's2', q 300}," +
" TUPLE {s 's3', p 'p2', q 200}}";
testEquals("true", src);
}
@Test
public void testRelComp5a() {
String src = "RELATION {" +
" TUPLE {q 300, s 's2', p 'p1'}," +
" TUPLE {s 's2', p 'p2', q 400}," +
" TUPLE {s 's3', p 'p2', q 200}} ⊆ " +
"RELATION {" +
" TUPLE {p 'p2', s 's2', q 400}," +
" TUPLE {p 'p1', s 's2', q 300}," +
" TUPLE {s 's3', p 'p2', q 200}}";
testEquals("true", src);
}
@Test
public void testGroup1() {
String src = "RELATION {" +
" TUPLE {s 's2', p 'p1', q 300}," +
" TUPLE {s 's2', p 'p2', q 400}," +
" TUPLE {s 's3', p 'p2', q 200}} GROUP {p, q} AS pq";
testEquals("RELATION {s CHARACTER, pq RELATION {p CHARACTER, q INTEGER}} {\n\t" +
"TUPLE {s \"s3\", pq RELATION {p CHARACTER, q INTEGER} {\n\t" +
"TUPLE {p \"p2\", q 200}\n" +
"}},\n\t" +
"TUPLE {s \"s2\", pq RELATION {p CHARACTER, q INTEGER} {\n\t" +
"TUPLE {p \"p1\", q 300},\n\t" +
"TUPLE {p \"p2\", q 400}\n" +
"}}\n" +
"}", src);
}
@Test
public void testGroup2() {
String src = "RELATION {" +
" TUPLE {s 's2', p 'p1', q 300}," +
" TUPLE {s 's2', p 'p2', q 400}," +
" TUPLE {s 's3', p 'p2', q 200}} GROUP {ALL BUT s} AS pq";
testEquals("RELATION {s CHARACTER, pq RELATION {p CHARACTER, q INTEGER}} {\n\t" +
"TUPLE {s \"s3\", pq RELATION {p CHARACTER, q INTEGER} {\n\tTUPLE {p \"p2\", q 200}\n}},\n\t" +
"TUPLE {s \"s2\", pq RELATION {p CHARACTER, q INTEGER} {\n\tTUPLE {p \"p1\", q 300},\n\tTUPLE {p \"p2\", q 400}\n}}\n" +
"}", src);
}
@Test
public void testGroup3() {
String src = "RELATION {" +
" TUPLE {s 's2', p 'p1', q 300}," +
" TUPLE {s 's2', p 'p2', q 400}," +
" TUPLE {s 's3', p 'p2', q 200}} GROUP {ALL BUT} AS pq";
testEquals("RELATION {pq RELATION {s CHARACTER, p CHARACTER, q INTEGER}} {\n\tTUPLE {" +
"pq RELATION {s CHARACTER, p CHARACTER, q INTEGER} {\n\tTUPLE {s \"s2\", p \"p1\", q 300}," +
"\n\tTUPLE {s \"s2\", p \"p2\", q 400}," +
"\n\tTUPLE {s \"s3\", p \"p2\", q 200}\n}}" +
"\n}", src);
}
@Test
public void testUnGroup1() {
String src = "(RELATION {" +
" TUPLE {s 's2', p 'p1', q 300}," +
" TUPLE {s 's2', p 'p2', q 400}," +
" TUPLE {s 's3', p 'p2', q 200}} GROUP {p, q} AS pq) UNGROUP pq";
testEquals("RELATION {s CHARACTER, p CHARACTER, q INTEGER} {" +
"\n\tTUPLE {s \"s3\", p \"p2\", q 200}," +
"\n\tTUPLE {s \"s2\", p \"p1\", q 300}," +
"\n\tTUPLE {s \"s2\", p \"p2\", q 400}\n}", src);
}
@Test
public void testRelationRename1() {
String src =
"BEGIN;" +
"var a private relation {w char, y boolean, z rational, x integer} key {all but};" +
"a := relation {tuple {x 3, w 'test', y true, z 2.5}};" +
"END;" +
"a rename {w as woggle, z as zork}";
testEquals("RELATION {woggle CHARACTER, y BOOLEAN, zork RATIONAL, x INTEGER} {\n\tTUPLE {woggle \"test\", y true, zork 2.5, x 3}\n}", src);
}
@Test
public void testRelationRename2() {
String src =
"BEGIN;" +
"var a private relation {zot_w char, zot_y boolean, zot_z rational, zot_x integer} key {all but};" +
"a := relation {tuple {zot_x 3, zot_w 'test', zot_y true, zot_z 2.5}};" +
"END;" +
"a rename {prefix 'zot' as 'zap'}";
testEquals("RELATION {zap_w CHARACTER, zap_y BOOLEAN, zap_z RATIONAL, zap_x INTEGER} {\n\tTUPLE {zap_w \"test\", zap_y true, zap_z 2.5, zap_x 3}\n}", src);
}
@Test
public void testRelationRename3() {
String src =
"BEGIN;" +
"var a private relation {w_zot char, y_zot boolean, z_zot rational, x_zot integer} key {all but};" +
"a := relation {tuple {x_zot 3, w_zot 'test', y_zot true, z_zot 2.5}};" +
"END;" +
"a rename {suffix 'zot' as 'zap'}";
testEquals("RELATION {w_zap CHARACTER, y_zap BOOLEAN, z_zap RATIONAL, x_zap INTEGER} {\n\tTUPLE {w_zap \"test\", y_zap true, z_zap 2.5, x_zap 3}\n}", src);
}
@Test
public void testRelationIsEmpty1() {
String src =
"BEGIN;" +
"var a private relation {w_zot char, y_zot boolean, z_zot rational, x_zot integer} key {all but};" +
"a := relation {tuple {x_zot 3, w_zot 'test', y_zot true, z_zot 2.5}};" +
"END;" +
"IS_EMPTY(a)";
testEquals("false", src);
}
@Test
public void testRelationIsEmpty2() {
String src =
"BEGIN;" +
"var a private relation {w_zot char, y_zot boolean, z_zot rational, x_zot integer} key {all but};" +
"END;" +
"IS_EMPTY(a)";
testEquals("true", src);
}
@Test
public void testRelationCount1() {
String src =
"BEGIN;" +
"var a private relation {w_zot char, y_zot boolean, z_zot rational, x_zot integer} key {w_zot};" +
"END;" +
"COUNT(a)";
testEquals("0", src);
}
@Test
public void testRelationCount2() {
String src =
"BEGIN;" +
"var a private relation {w_zot char, x_zot integer} key {w_zot};" +
"a := relation {tuple {w_zot 'blah', x_zot 2}, tuple {x_zot 3, w_zot 'zog'}};" +
"END;" +
"COUNT(a)";
testEquals("2", src);
}
@Test
public void testRelationSum1() {
String src =
"BEGIN;" +
"var a private relation {w_zot char, y_zot boolean, z_zot rational, x_zot integer} key {w_zot};" +
"END;" +
"SUM(a, x_zot)";
testEquals("0", src);
}
@Test
public void testRelationSum2() {
String src =
"BEGIN;" +
"var a private relation {w_zot char, x_zot integer} key {w_zot};" +
"a := relation {tuple {w_zot 'blah', x_zot 2}, tuple {x_zot 3, w_zot 'zog'}};" +
"END;" +
"SUM(a, x_zot)";
testEquals("5", src);
}
@Test
public void testRelationSum2a() {
String src =
"BEGIN;" +
"var a private relation {w_zot char, x_zot integer} key {w_zot};" +
"a := relation {tuple {w_zot 'blah', x_zot 2}, tuple {x_zot 3, w_zot 'zog'}};" +
"END;" +
"SUM(a, x_zot + 1)";
testEquals("7", src);
}
@Test
public void testRelationSum3() {
String src =
"BEGIN;" +
"var a private relation {w_zot char, x_zot rational} key {w_zot};" +
"a := relation {tuple {w_zot 'blah', x_zot 2.4}, tuple {x_zot 3.1, w_zot 'zog'}};" +
"END;" +
"SUM(a, x_zot)";
testEquals("5.5", src);
}
@Test
public void testRelationAvg1() {
String src =
"BEGIN;" +
"var a private relation {w_zot char, x_zot integer} key {w_zot};" +
"a := relation {tuple {w_zot 'blah', x_zot 2}, tuple {x_zot 3, w_zot 'zog'}};" +
"END;" +
"AVG(a, x_zot)";
testEquals("2.5", src);
}
@Test
public void testRelationAvg1a() {
String src =
"BEGIN;" +
"var a private relation {w_zot char, x_zot integer} key {w_zot};" +
"a := relation {tuple {w_zot 'blah', x_zot 2}, tuple {x_zot 3, w_zot 'zog'}};" +
"END;" +
"AVG(a, x_zot + 1)";
testEquals("3.5", src);
}
@Test
public void testRelationMax1() {
String src =
"BEGIN;" +
"var a private relation {w_zot char, x_zot integer} key {w_zot};" +
"a := relation {tuple {w_zot 'blah', x_zot 2}, tuple {x_zot 3, w_zot 'zog'}};" +
"END;" +
"MAX(a, x_zot)";
testEquals("3", src);
}
@Test
public void testRelationMin1() {
String src =
"BEGIN;" +
"var a private relation {w_zot char, x_zot integer} key {w_zot};" +
"a := relation {tuple {w_zot 'blah', x_zot 2}, tuple {x_zot 3, w_zot 'zog'}};" +
"END;" +
"MIN(a, x_zot)";
testEquals("2", src);
}
@Test
public void testRelationAnd1() {
String src =
"BEGIN;" +
"var a private relation {w_zot boolean, x_zot integer} key {x_zot};" +
"a := relation {tuple {w_zot true, x_zot 2}, tuple {x_zot 3, w_zot true}};" +
"END;" +
"AND(a, w_zot)";
testEquals("true", src);
}
@Test
public void testRelationAnd2() {
String src =
"BEGIN;" +
"var a private relation {w_zot boolean, x_zot integer} key {x_zot};" +
"a := relation {tuple {w_zot false, x_zot 2}, tuple {x_zot 3, w_zot true}};" +
"END;" +
"AND(a, w_zot)";
testEquals("false", src);
}
@Test
public void testRelationAnd3() {
String src =
"BEGIN;" +
"var a private relation {w_zot boolean, x_zot integer} key {x_zot};" +
"a := relation {tuple {w_zot false, x_zot 2}, tuple {x_zot 3, w_zot false}};" +
"END;" +
"AND(a, w_zot)";
testEquals("false", src);
}
@Test
public void testRelationAnd4() {
String src =
"BEGIN;" +
"var a private relation {w_zot boolean, x_zot integer} key {x_zot};" +
"END;" +
"AND(a, w_zot)";
testEquals("true", src);
}
@Test
public void testRelationOr1() {
String src =
"BEGIN;" +
"var a private relation {w_zot boolean, x_zot integer} key {x_zot};" +
"a := relation {tuple {w_zot true, x_zot 2}, tuple {x_zot 3, w_zot true}};" +
"END;" +
"OR(a, w_zot)";
testEquals("true", src);
}
@Test
public void testRelationOr2() {
String src =
"BEGIN;" +
"var a private relation {w_zot boolean, x_zot integer} key {x_zot};" +
"a := relation {tuple {w_zot false, x_zot 2}, tuple {x_zot 3, w_zot true}};" +
"END;" +
"OR(a, w_zot)";
testEquals("true", src);
}
@Test
public void testRelationOr3() {
String src =
"BEGIN;" +
"var a private relation {w_zot boolean, x_zot integer} key {x_zot};" +
"a := relation {tuple {w_zot false, x_zot 2}, tuple {x_zot 3, w_zot false}};" +
"END;" +
"OR(a, w_zot)";
testEquals("false", src);
}
@Test
public void testRelationOr4() {
String src =
"BEGIN;" +
"var a private relation {w_zot boolean, x_zot integer} key {x_zot};" +
"END;" +
"OR(a, w_zot)";
testEquals("false", src);
}
@Test
public void testRelationXor1() {
String src =
"BEGIN;" +
"var a private relation {w_zot boolean, x_zot integer} key {x_zot};" +
"a := relation {tuple {w_zot true, x_zot 2}, tuple {x_zot 3, w_zot true}};" +
"END;" +
"XOR(a, w_zot)";
testEquals("false", src);
}
@Test
public void testRelationXor2() {
String src =
"BEGIN;" +
"var a private relation {w_zot boolean, x_zot integer} key {x_zot};" +
"a := relation {tuple {w_zot false, x_zot 2}, tuple {x_zot 3, w_zot true}};" +
"END;" +
"XOR(a, w_zot)";
testEquals("true", src);
}
@Test
public void testRelationXor3() {
String src =
"BEGIN;" +
"var a private relation {w_zot boolean, x_zot integer} key {x_zot};" +
"a := relation {tuple {w_zot false, x_zot 2}, tuple {x_zot 3, w_zot false}};" +
"END;" +
"XOR(a, w_zot)";
testEquals("false", src);
}
@Test
public void testRelationXor4() {
String src =
"BEGIN;" +
"var a private relation {w_zot boolean, x_zot integer} key {x_zot};" +
"END;" +
"XOR(a, w_zot)";
testEquals("false", src);
}
@Test
public void testRelationAggregateUnion1() {
String src =
"BEGIN;" +
"var a private relation {w_zot relation {a integer, b char}, x_zot integer} key {x_zot};" +
"a := relation {" +
"tuple {w_zot relation {tuple {a 1, b 'x'}, tuple {a 2, b 'y'}}, x_zot 3}," +
"tuple {w_zot relation {tuple {a 5, b 'z'}, tuple {a 2, b 'y'}}, x_zot 4}" +
"};" +
"END;" +
"UNION(a, w_zot)";
testEquals("RELATION {a INTEGER, b CHARACTER} {\n\tTUPLE {a 1, b \"x\"},\n\tTUPLE {a 2, b \"y\"},\n\tTUPLE {a 5, b \"z\"}\n}", src);
}
@Test
public void testRelationAggregateUnion2() {
String src =
"BEGIN;" +
"var a private relation {w_zot relation {a integer, b char}, x_zot integer} key {x_zot};" +
"a := relation {" +
"tuple {w_zot relation {tuple {a 1, b 'x'}, tuple {a 2, b 'y'}}, x_zot 3}," +
"tuple {x_zot 4, w_zot relation {tuple {b 'z', a 5}, tuple {b 'y', a 2}}}" +
"};" +
"END;" +
"UNION(a, w_zot)";
testEquals("RELATION {a INTEGER, b CHARACTER} {\n\tTUPLE {a 1, b \"x\"},\n\tTUPLE {a 2, b \"y\"},\n\tTUPLE {a 5, b \"z\"}\n}", src);
}
@Test
public void testRelationAggregateXunion1() {
String src =
"BEGIN;" +
"var a private relation {w_zot relation {a integer, b char}, x_zot integer} key {x_zot};" +
"a := relation {" +
"tuple {w_zot relation {tuple {a 1, b 'x'}, tuple {a 2, b 'y'}}, x_zot 3}," +
"tuple {w_zot relation {tuple {a 5, b 'z'}, tuple {a 2, b 'y'}}, x_zot 4}" +
"};" +
"END;" +
"XUNION(a, w_zot)";
testEquals("RELATION {a INTEGER, b CHARACTER} {\n\tTUPLE {a 1, b \"x\"},\n\tTUPLE {a 5, b \"z\"}\n}", src);
}
@Test
public void testRelationAggregateXunion2() {
String src =
"BEGIN;" +
"var a private relation {w_zot relation {a integer, b char}, x_zot integer} key {x_zot};" +
"a := relation {" +
"tuple {w_zot relation {tuple {a 1, b 'x'}, tuple {a 2, b 'y'}}, x_zot 3}," +
"tuple {x_zot 4, w_zot relation {tuple {b 'z', a 5}, tuple {b 'y', a 2}}}" +
"};" +
"END;" +
"XUNION(a, w_zot)";
testEquals("RELATION {a INTEGER, b CHARACTER} {\n\tTUPLE {a 1, b \"x\"},\n\tTUPLE {a 5, b \"z\"}\n}", src);
}
@Test
public void testRelationAggregateDUnion1() {
String src =
"BEGIN;" +
"var a private relation {w_zot relation {a integer, b char}, x_zot integer} key {x_zot};" +
"a := relation {" +
"tuple {w_zot relation {tuple {a 1, b 'x'}, tuple {a 2, b 'y'}}, x_zot 3}," +
"tuple {w_zot relation {tuple {a 5, b 'z'}}, x_zot 4}" +
"};" +
"END;" +
"D_UNION(a, w_zot)";
String expectedResult =
"RELATION {a INTEGER, b CHARACTER} {" +
"\n\tTUPLE {a 1, b \"x\"}," +
"\n\tTUPLE {a 2, b \"y\"}," +
"\n\tTUPLE {a 5, b \"z\"}" +
"\n}";
testEquals(expectedResult, src);
}
@Test
public void testRelationAggregateDUnion2() {
String src =
"BEGIN;" +
"var a private relation {w_zot relation {a integer, b char}, x_zot integer} key {x_zot};" +
"a := relation {" +
"tuple {w_zot relation {tuple {a 1, b 'x'}, tuple {a 2, b 'y'}}, x_zot 3}," +
"tuple {x_zot 4, w_zot relation {tuple {b 'z', a 5}}}" +
"};" +
"END;" +
"D_UNION(a, w_zot)";
testEquals("RELATION {a INTEGER, b CHARACTER} {\n\tTUPLE {a 1, b \"x\"},\n\tTUPLE {a 2, b \"y\"},\n\tTUPLE {a 5, b \"z\"}\n}", src);
}
@Test
public void testRelationAggregateIntersect() {
String src =
"BEGIN;" +
"var a private relation {w_zot relation {a integer, b char}, x_zot integer} key {x_zot};" +
"a := relation {" +
"tuple {w_zot relation {tuple {a 1, b 'x'}, tuple {a 2, b 'y'}}, x_zot 3}," +
"tuple {w_zot relation {tuple {a 5, b 'z'}, tuple {a 2, b 'y'}}, x_zot 4}" +
"};" +
"END;" +
"INTERSECT(a, w_zot)";
testEquals("RELATION {a INTEGER, b CHARACTER} {\n\tTUPLE {a 2, b \"y\"}\n}", src);
}
@Test
public void testRelationAggregateIntersect2() {
String src =
"BEGIN;" +
"var a private relation {w_zot relation {a integer, b char}, x_zot integer} key {x_zot};" +
"a := relation {" +
"tuple {w_zot relation {tuple {a 1, b 'x'}, tuple {a 2, b 'y'}}, x_zot 3}," +
"tuple {x_zot 4, w_zot relation {tuple {b 'z', a 5}, tuple {b 'y', a 2}}}" +
"};" +
"END;" +
"INTERSECT(a, w_zot)";
testEquals("RELATION {a INTEGER, b CHARACTER} {\n\tTUPLE {a 2, b \"y\"}\n}", src);
}
@Test
public void testAggregateExactly1() {
String src =
"BEGIN;" +
"var a private relation {x char, y boolean} key {x};" +
"END;" +
"EXACTLY(0, a, y)";
testEquals("true", src);
}
@Test
public void testAggregateExactly2() {
String src =
"BEGIN;" +
"var a private relation {x char, y boolean} key {x};" +
"a := relation {" +
"tuple {y false, x 'blah'}" +
"};" +
"END;" +
"EXACTLY(0, a, y)";
testEquals("true", src);
}
@Test
public void testAggregateExactly3() {
String src =
"BEGIN;" +
"var a private relation {x char, y boolean} key {x};" +
"a := relation {" +
"tuple {y true, x 'blah'}" +
"};" +
"END;" +
"EXACTLY(0, a, y)";
testEquals("false", src);
}
@Test
public void testAggregateExactly4() {
String src =
"BEGIN;" +
"var a private relation {x char, y boolean} key {x};" +
"a := relation {" +
"tuple {y true, x 'blah'}," +
"tuple {y false, x 'blat'}" +
"};" +
"END;" +
"EXACTLY(1, a, y)";
testEquals("true", src);
}
@Test
public void testAggregateExactly5() {
String src =
"BEGIN;" +
"var a private relation {x char, y boolean} key {x};" +
"a := relation {" +
"tuple {y true, x 'blah'}," +
"tuple {x 'blat', y false}," +
"tuple {y true, x 'zot'}" +
"};" +
"END;" +
"EXACTLY(2, a, y)";
testEquals("true", src);
}
@Test
public void testRelationNadicUnion1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 3, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 3, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"UNION {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 2.8, z \"glob\"},\n\tTUPLE {x 3, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testRelationNadicUnion2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 4, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"UNION {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 4.5, z \"test\"},\n\tTUPLE {x 6, y 2.8, z \"glob\"},\n\tTUPLE {x 4, y 2.8, z \"glob\"},\n\tTUPLE {x 5, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testRelationNadicXunion1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 3, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 3, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"XUNION {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n}", src);
}
@Test
public void testRelationNadicXunion2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 4, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"XUNION {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 6, y 2.8, z \"glob\"},\n\tTUPLE {x 4, y 2.8, z \"glob\"}\n}", src);
}
@Test
public void testRelationNadicDUnion1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 4, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"D_UNION {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 4.5, z \"test\"},\n\tTUPLE {x 6, y 2.8, z \"glob\"},\n\tTUPLE {x 4, y 2.8, z \"glob\"},\n\tTUPLE {x 5, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testRelationNadicIntersect1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 4, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"INTERSECT {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n}", src);
}
@Test
public void testRelationNadicIntersect2() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 3, y 4.5, z \"test\"},\n" +
" tuple {z \"glob\", x 6, y 2.8}\n" +
"}) KEY {ALL BUT};\n" +
"VAR b PRIVATE INIT(relation {\n" +
" tuple {x 5, y 4.5, z \"test\"},\n" +
" tuple {z \"test\", x 3, y 4.5}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"INTERSECT {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testRelationNadicJoin1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5}," +
" tuple {x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}," +
" tuple {a 4.6, b 9}" +
"}) KEY {ALL BUT};" +
"END;" +
"JOIN {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, a RATIONAL, b INTEGER} {\n\tTUPLE {x 3, y 4.5, a 4.5, b 7},\n\tTUPLE {x 3, y 4.5, a 4.6, b 9},\n\tTUPLE {x 3, y 4.5, a 4.8, b 8},\n\tTUPLE {x 6, y 2.8, a 4.5, b 7},\n\tTUPLE {x 6, y 2.8, a 4.6, b 9},\n\tTUPLE {x 6, y 2.8, a 4.8, b 8}\n}", src);
}
@Test
public void testRelationNadicJoin2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DUM) KEY{ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"JOIN {a, b}";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n}", src);
}
@Test
public void testRelationNadicJoin3() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DUM) KEY{ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"JOIN {a, b}";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n}", src);
}
@Test
public void testRelationNadicJoin4() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DEE) KEY{ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"JOIN {a, b}";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n\tTUPLE {a 4.5, b 7},\n\tTUPLE {a 4.8, b 8}\n}", src);
}
@Test
public void testRelationNadicJoin5() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DEE) KEY{ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"JOIN {a, b}";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n\tTUPLE {a 4.5, b 7},\n\tTUPLE {a 4.8, b 8}\n}", src);
}
@Test
public void testRelationNadicJoin6() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, a 4.5, b \"test\"}," +
" tuple {b \"zot\", x 3, a 4.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"JOIN {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER, a RATIONAL, b CHARACTER} {\n\tTUPLE {x 3, y 4.5, z \"test\", a 4.8, b \"zot\"}\n}", src);
}
@Test
public void testRelationNadicCompose1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5}," +
" tuple {x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}," +
" tuple {a 4.6, b 9}" +
"}) KEY {ALL BUT};" +
"END;" +
"COMPOSE {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, a RATIONAL, b INTEGER} {\n\tTUPLE {x 3, y 4.5, a 4.5, b 7},\n\tTUPLE {x 3, y 4.5, a 4.6, b 9},\n\tTUPLE {x 3, y 4.5, a 4.8, b 8},\n\tTUPLE {x 6, y 2.8, a 4.5, b 7},\n\tTUPLE {x 6, y 2.8, a 4.6, b 9},\n\tTUPLE {x 6, y 2.8, a 4.8, b 8}\n}", src);
}
@Test
public void testRelationNadicCompose2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DUM) KEY{ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"COMPOSE {a, b}";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n}", src);
}
@Test
public void testRelationNadicCompose3() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DUM) KEY{ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"COMPOSE {a, b}";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n}", src);
}
@Test
public void testRelationNadicCompose4() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DEE) KEY{ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"COMPOSE {a, b}";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n\tTUPLE {a 4.5, b 7},\n\tTUPLE {a 4.8, b 8}\n}", src);
}
@Test
public void testRelationNadicCompose5() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(TABLE_DEE) KEY{ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {a 4.5, b 7}," +
" tuple {a 4.8, b 8}" +
"}) KEY {ALL BUT};" +
"END;" +
"COMPOSE {a, b}";
testEquals("RELATION {a RATIONAL, b INTEGER} {\n\tTUPLE {a 4.5, b 7},\n\tTUPLE {a 4.8, b 8}\n}", src);
}
@Test
public void testRelationNadicCompose6() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, a 4.5, b \"test\"}," +
" tuple {b \"zot\", x 3, a 4.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"COMPOSE {a, b}";
testEquals("RELATION {y RATIONAL, z CHARACTER, a RATIONAL, b CHARACTER} {\n\tTUPLE {y 4.5, z \"test\", a 4.8, b \"zot\"}\n}", src);
}
@Test
public void testRelationNadicHeadingUnion1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 3, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 3, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"UNION {x integer, y rational, z char} {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 2.8, z \"glob\"},\n\tTUPLE {x 3, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testRelationNadicHeadingUnion2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 4, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"UNION {x integer, y rational, z char} {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 4.5, z \"test\"},\n\tTUPLE {x 6, y 2.8, z \"glob\"},\n\tTUPLE {x 4, y 2.8, z \"glob\"},\n\tTUPLE {x 5, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testRelationNadicHeadingXunion1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 3, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 3, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"XUNION {x integer, y rational, z char} {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n}", src);
}
@Test
public void testRelationNadicHeadingXunion2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 4, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"XUNION {x integer, y rational, z char} {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 4.5, z \"test\"},\n\tTUPLE {x 6, y 2.8, z \"glob\"},\n\tTUPLE {x 4, y 2.8, z \"glob\"},\n\tTUPLE {x 5, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testRelationNadicHeadingDUnion1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 4, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"D_UNION {x integer, y rational, z char} {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 4.5, z \"test\"},\n\tTUPLE {x 6, y 2.8, z \"glob\"},\n\tTUPLE {x 4, y 2.8, z \"glob\"},\n\tTUPLE {x 5, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testRelationNadicHeadingIntersect1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {" +
" tuple {x 3, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 6, y 2.8}" +
"}) KEY {ALL BUT};" +
"VAR b PRIVATE INIT(relation {" +
" tuple {x 5, y 4.5, z \"test\"}," +
" tuple {z \"glob\", x 4, y 2.8}" +
"}) KEY {ALL BUT};" +
"END;" +
"INTERSECT {x integer, y rational, z char} {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n}", src);
}
@Test
public void testRelationNadicHeadingIntersect2() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 3, y 4.5, z \"test\"},\n" +
" tuple {z \"glob\", x 6, y 2.8}\n" +
"}) KEY {ALL BUT};\n" +
"VAR b PRIVATE INIT(relation {\n" +
" tuple {x 5, y 4.5, z \"test\"},\n" +
" tuple {z \"test\", x 3, y 4.5}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"INTERSECT {x integer, y rational, z char} {a, b}";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 3, y 4.5, z \"test\"}\n}", src);
}
@Test public void testCast01() {assertValueEquals(ValueBoolean.select(generator, false), testEvaluate("CAST_AS_BOOLEAN(0)").getValue());}
@Test public void testCast02() {assertValueEquals(ValueBoolean.select(generator, true), testEvaluate("CAST_AS_BOOLEAN(1)").getValue());}
@Test public void testCast03() {assertValueEquals(ValueBoolean.select(generator, false), testEvaluate("CAST_AS_BOOLEAN(0.0)").getValue());}
@Test public void testCast04() {assertValueEquals(ValueBoolean.select(generator, true), testEvaluate("CAST_AS_BOOLEAN(1.2)").getValue());}
@Test public void testCast05() {assertValueEquals(ValueBoolean.select(generator, true), testEvaluate("CAST_AS_BOOLEAN(true)").getValue());}
@Test public void testCast06() {assertValueEquals(ValueBoolean.select(generator, false), testEvaluate("CAST_AS_BOOLEAN(false)").getValue());}
@Test public void testCast07() {assertValueEquals(ValueBoolean.select(generator, true), testEvaluate("CAST_AS_BOOLEAN('true')").getValue());}
@Test public void testCast08() {assertValueEquals(ValueBoolean.select(generator, false), testEvaluate("CAST_AS_BOOLEAN('false')").getValue());}
@Test public void testCast09() {assertValueEquals(ValueInteger.select(generator, 0), testEvaluate("CAST_AS_INTEGER(0)").getValue());}
@Test public void testCast10() {assertValueEquals(ValueInteger.select(generator, 1), testEvaluate("CAST_AS_INTEGER(1)").getValue());}
@Test public void testCast11() {assertValueEquals(ValueInteger.select(generator, 0), testEvaluate("CAST_AS_INTEGER(0.0)").getValue());}
@Test public void testCast12() {assertValueEquals(ValueInteger.select(generator, 1), testEvaluate("CAST_AS_INTEGER(1.2)").getValue());}
@Test public void testCast13() {assertValueEquals(ValueInteger.select(generator, 1), testEvaluate("CAST_AS_INTEGER(true)").getValue());}
@Test public void testCast14() {assertValueEquals(ValueInteger.select(generator, 0), testEvaluate("CAST_AS_INTEGER(false)").getValue());}
@Test public void testCast15() {assertValueEquals(ValueInteger.select(generator, 0), testEvaluate("CAST_AS_INTEGER('0')").getValue());}
@Test public void testCast16() {assertValueEquals(ValueInteger.select(generator, 1), testEvaluate("CAST_AS_INTEGER('1')").getValue());}
@Test public void testCast17() {assertValueEquals(ValueInteger.select(generator, 0), testEvaluate("CAST_AS_INTEGER('0.0')").getValue());}
@Test public void testCast18() {assertValueEquals(ValueInteger.select(generator, 1), testEvaluate("CAST_AS_INTEGER('1.2')").getValue());}
@Test public void testCast19() {assertValueEquals(ValueRational.select(generator, 0), testEvaluate("CAST_AS_RATIONAL(0)").getValue());}
@Test public void testCast20() {assertValueEquals(ValueRational.select(generator, 1), testEvaluate("CAST_AS_RATIONAL(1)").getValue());}
@Test public void testCast21() {assertValueEquals(ValueRational.select(generator, 1.2), testEvaluate("CAST_AS_RATIONAL(1.2)").getValue());}
@Test public void testCast22() {assertValueEquals(ValueRational.select(generator, 1), testEvaluate("CAST_AS_RATIONAL(true)").getValue());}
@Test public void testCast23() {assertValueEquals(ValueRational.select(generator, 0), testEvaluate("CAST_AS_RATIONAL(false)").getValue());}
@Test public void testCast24() {assertValueEquals(ValueRational.select(generator, 0), testEvaluate("CAST_AS_RATIONAL('0')").getValue());}
@Test public void testCast25() {assertValueEquals(ValueRational.select(generator, 1), testEvaluate("CAST_AS_RATIONAL('1')").getValue());}
@Test public void testCast26() {assertValueEquals(ValueRational.select(generator, 0.0), testEvaluate("CAST_AS_RATIONAL('0.0')").getValue());}
@Test public void testCast27() {assertValueEquals(ValueRational.select(generator, 1.2), testEvaluate("CAST_AS_RATIONAL('1.2')").getValue());}
@Test public void testCast28() {assertValueEquals(ValueCharacter.select(generator, "0"), testEvaluate("CAST_AS_CHAR(0)").getValue());}
@Test public void testCast29() {assertValueEquals(ValueCharacter.select(generator, "1"), testEvaluate("CAST_AS_CHAR(1)").getValue());}
@Test public void testCast30() {assertValueEquals(ValueCharacter.select(generator, "0.0"), testEvaluate("CAST_AS_CHAR(0.0)").getValue());}
@Test public void testCast31() {assertValueEquals(ValueCharacter.select(generator, "1.2"), testEvaluate("CAST_AS_CHAR(1.2)").getValue());}
@Test public void testCast32() {assertValueEquals(ValueCharacter.select(generator, "true"), testEvaluate("CAST_AS_CHAR(true)").getValue());}
@Test public void testCast33() {assertValueEquals(ValueCharacter.select(generator, "false"), testEvaluate("CAST_AS_CHAR(false)").getValue());}
@Test
public void testSummarizeSimulatedCount() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"WITH (r1 := a,\n" +
" r2 := a {z}) :\n" +
"(EXTEND r2 : {Y := r1 JOIN RELATION {TUPLE {z z}},\n" +
" CountOfx := COUNT(Y)})\n" +
" {ALL BUT Y}" +
"";
testEquals("RELATION {z CHARACTER, CountOfx INTEGER} {\n\tTUPLE {z \"test\", CountOfx 4},\n\tTUPLE {z \"glub\", CountOfx 2},\n\tTUPLE {z \"zot\", CountOfx 1}\n}", src);
}
@Test
public void testSummarizeSimulatedCountDistinct() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"WITH (r1 := a,\n" +
" r2 := a {z}) :\n" +
"(EXTEND r2 : {Y := r1 JOIN RELATION {TUPLE {z z}},\n" +
" CountOfx := COUNT((EXTEND Y : {X := x}) {X})})\n" +
" {ALL BUT Y}" +
"";
testEquals("RELATION {z CHARACTER, CountOfx INTEGER} {\n\tTUPLE {z \"test\", CountOfx 4},\n\tTUPLE {z \"glub\", CountOfx 2},\n\tTUPLE {z \"zot\", CountOfx 1}\n}", src);
}
@Test
public void testSummarizeSimulatedSum() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"WITH (r1 := a,\n" +
" r2 := a {z}) :\n" +
"(EXTEND r2 : {Y := r1 JOIN RELATION {TUPLE {z z}},\n" +
" totalOfx := SUM((EXTEND Y : {X := x}), X)})\n" +
" {ALL BUT Y}" +
"";
testEquals("RELATION {z CHARACTER, totalOfx INTEGER} {\n\tTUPLE {z \"test\", totalOfx 15},\n\tTUPLE {z \"glub\", totalOfx 7},\n\tTUPLE {z \"zot\", totalOfx 6}\n}", src);
}
@Test
public void testSummarizeSimulatedSumDistinct() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"WITH (r1 := a,\n" +
" r2 := a {z}) :\n" +
"(EXTEND r2 : {Y := r1 JOIN RELATION {TUPLE {z z}},\n" +
" totalOfx := SUM((EXTEND Y : {X := x}) {X}, X)})\n" +
" {ALL BUT Y}" +
"";
testEquals("RELATION {z CHARACTER, totalOfx INTEGER} {\n\tTUPLE {z \"test\", totalOfx 15},\n\tTUPLE {z \"glub\", totalOfx 7},\n\tTUPLE {z \"zot\", totalOfx 6}\n}", src);
}
@Test
public void testSummarizeSimulatedAvg() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"WITH (r1 := a,\n" +
" r2 := a {z}) :\n" +
"(EXTEND r2 : {Y := r1 JOIN RELATION {TUPLE {z z}},\n" +
" averageOfx := AVG((EXTEND Y : {X := x}), X)})\n" +
" {ALL BUT Y}" +
"";
testEquals("RELATION {z CHARACTER, averageOfx RATIONAL} {\n\tTUPLE {z \"test\", averageOfx 3.75},\n\tTUPLE {z \"glub\", averageOfx 3.5},\n\tTUPLE {z \"zot\", averageOfx 6.0}\n}", src);
}
@Test
public void testSummarizeSimulatedAvgDistinct() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"WITH (r1 := a,\n" +
" r2 := a {z}) :\n" +
"(EXTEND r2 : {Y := r1 JOIN RELATION {TUPLE {z z}},\n" +
" averageOfx := AVG((EXTEND Y : {X := x}) {X}, X)})\n" +
" {ALL BUT Y}" +
"";
testEquals("RELATION {z CHARACTER, averageOfx RATIONAL} {\n\tTUPLE {z \"test\", averageOfx 3.75},\n\tTUPLE {z \"glub\", averageOfx 3.5},\n\tTUPLE {z \"zot\", averageOfx 6.0}\n}", src);
}
@Test
public void testSummarizeSimulatedMin() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"WITH (r1 := a,\n" +
" r2 := a {z}) :\n" +
"(EXTEND r2 : {Y := r1 JOIN RELATION {TUPLE {z z}},\n" +
" minOfx := MIN((EXTEND Y : {X := x}), X)})\n" +
" {ALL BUT Y}" +
"";
testEquals("RELATION {z CHARACTER, minOfx INTEGER} {\n\tTUPLE {z \"test\", minOfx 1},\n\tTUPLE {z \"glub\", minOfx 3},\n\tTUPLE {z \"zot\", minOfx 6}\n}", src);
}
@Test
public void testSummarizeSimulatedMax() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"WITH (r1 := a,\n" +
" r2 := a {z}) :\n" +
"(EXTEND r2 : {Y := r1 JOIN RELATION {TUPLE {z z}},\n" +
" maxOfx := MAX((EXTEND Y : {X := x}), X)})\n" +
" {ALL BUT Y}" +
"";
testEquals("RELATION {z CHARACTER, maxOfx INTEGER} {\n\tTUPLE {z \"test\", maxOfx 7},\n\tTUPLE {z \"glub\", maxOfx 4},\n\tTUPLE {z \"zot\", maxOfx 6}\n}", src);
}
@Test
public void testSummarizeCount1() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a PER (a {z}) : {CountOfx := COUNT()}";
testEquals("RELATION {z CHARACTER, CountOfx INTEGER} {\n\tTUPLE {z \"test\", CountOfx 4},\n\tTUPLE {z \"glub\", CountOfx 2},\n\tTUPLE {z \"zot\", CountOfx 1}\n}", src);
}
@Test
public void testSummarizeCount2() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a BY {z} : {CountOfx := COUNT()}";
testEquals("RELATION {z CHARACTER, CountOfx INTEGER} {\n\tTUPLE {z \"test\", CountOfx 4},\n\tTUPLE {z \"glub\", CountOfx 2},\n\tTUPLE {z \"zot\", CountOfx 1}\n}", src);
}
@Test
public void testSummarizeCountDistinct() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a PER (a {z}) : {CountOfx := COUNTD(x)}";
testEquals("RELATION {z CHARACTER, CountOfx INTEGER} {\n\tTUPLE {z \"test\", CountOfx 4},\n\tTUPLE {z \"glub\", CountOfx 2},\n\tTUPLE {z \"zot\", CountOfx 1}\n}", src);
}
@Test
public void testSummarizeSum1() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a PER (a {z}) : {totalOfx := SUM(x)}";
testEquals("RELATION {z CHARACTER, totalOfx INTEGER} {\n\tTUPLE {z \"test\", totalOfx 15},\n\tTUPLE {z \"glub\", totalOfx 7},\n\tTUPLE {z \"zot\", totalOfx 6}\n}", src);
}
@Test
public void testSummarizeSum2() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a BY {z} : {totalOfx := SUM(x + 1)}";
testEquals("RELATION {z CHARACTER, totalOfx INTEGER} {\n\tTUPLE {z \"test\", totalOfx 19},\n\tTUPLE {z \"glub\", totalOfx 9},\n\tTUPLE {z \"zot\", totalOfx 7}\n}", src);
}
@Test
public void testSummarizeSum3() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a : {totalOfx := SUM(x)}";
testEquals("RELATION {totalOfx INTEGER} {\n\tTUPLE {totalOfx 28}\n}", src);
}
@Test
public void testSummarizeSumDistinct() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a PER (a {z}) : {totalOfx := SUMD(x)}";
testEquals("RELATION {z CHARACTER, totalOfx INTEGER} {\n\tTUPLE {z \"test\", totalOfx 15},\n\tTUPLE {z \"glub\", totalOfx 7},\n\tTUPLE {z \"zot\", totalOfx 6}\n}", src);
}
@Test
public void testSummarizeAvg() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a PER (a {z}) : {averageOfx := AVG(x)}";
testEquals("RELATION {z CHARACTER, averageOfx RATIONAL} {\n\tTUPLE {z \"test\", averageOfx 3.75},\n\tTUPLE {z \"glub\", averageOfx 3.5},\n\tTUPLE {z \"zot\", averageOfx 6.0}\n}", src);
}
@Test
public void testSummarizeAvgDistinct() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a PER (a {z}) : {averageOfx := AVGD(x)}";
testEquals("RELATION {z CHARACTER, averageOfx RATIONAL} {\n\tTUPLE {z \"test\", averageOfx 3.75},\n\tTUPLE {z \"glub\", averageOfx 3.5},\n\tTUPLE {z \"zot\", averageOfx 6.0}\n}", src);
}
@Test
public void testSummarizeMin() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a PER (a {z}) : {minOfx := MIN(x)}";
testEquals("RELATION {z CHARACTER, minOfx INTEGER} {\n\tTUPLE {z \"test\", minOfx 1},\n\tTUPLE {z \"glub\", minOfx 3},\n\tTUPLE {z \"zot\", minOfx 6}\n}", src);
}
@Test
public void testSummarizeMax() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a PER (a {z}) : {maxOfx := MAX(x)}";
testEquals("RELATION {z CHARACTER, maxOfx INTEGER} {\n\tTUPLE {z \"test\", maxOfx 7},\n\tTUPLE {z \"glub\", maxOfx 4},\n\tTUPLE {z \"zot\", maxOfx 6}\n}", src);
}
@Test
public void testSummarizeExactly() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a : {isThereThreeLessThanFour := EXACTLY(3, x < 4)}";
testEquals("RELATION {isThereThreeLessThanFour BOOLEAN} {\n\tTUPLE {isThereThreeLessThanFour true}\n}", src);
}
@Test
public void testSummarizeAnd() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x false, y 1.2, z \"falsefalse\"},\n" +
" tuple {x false, y 1.3, z \"falsefalse\"},\n" +
" tuple {x true, y 1.4, z \"truefalse\"},\n" +
" tuple {x false, y 1.5, z \"truefalse\"},\n" +
" tuple {x true, y 1.6, z \"truetrue\"},\n" +
" tuple {x true, y 1.7, z \"truetrue\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a BY {z} : {andOfx := AND(x)}";
testEquals("RELATION {z CHARACTER, andOfx BOOLEAN} {\n\tTUPLE {z \"falsefalse\", andOfx false},\n\tTUPLE {z \"truefalse\", andOfx false},\n\tTUPLE {z \"truetrue\", andOfx true}\n}", src);
}
@Test
public void testSummarizeOr() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x false, y 1.2, z \"falsefalse\"},\n" +
" tuple {x false, y 1.3, z \"falsefalse\"},\n" +
" tuple {x true, y 1.4, z \"truefalse\"},\n" +
" tuple {x false, y 1.5, z \"truefalse\"},\n" +
" tuple {x true, y 1.6, z \"truetrue\"},\n" +
" tuple {x true, y 1.7, z \"truetrue\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a BY {z} : {orOfx := OR(x)}";
testEquals("RELATION {z CHARACTER, orOfx BOOLEAN} {\n\tTUPLE {z \"falsefalse\", orOfx false},\n\tTUPLE {z \"truefalse\", orOfx true},\n\tTUPLE {z \"truetrue\", orOfx true}\n}", src);
}
@Test
public void testSummarizeXor() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x false, y 1.2, z \"falsefalse\"},\n" +
" tuple {x false, y 1.3, z \"falsefalse\"},\n" +
" tuple {x true, y 1.4, z \"truefalse\"},\n" +
" tuple {x false, y 1.5, z \"truefalse\"},\n" +
" tuple {x true, y 1.6, z \"truetrue\"},\n" +
" tuple {x true, y 1.7, z \"truetrue\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a BY {z} : {xorOfx := XOR(x)}";
testEquals("RELATION {z CHARACTER, xorOfx BOOLEAN} {\n\tTUPLE {z \"falsefalse\", xorOfx false},\n\tTUPLE {z \"truefalse\", xorOfx true},\n\tTUPLE {z \"truetrue\", xorOfx false}\n}", src);
}
@Test
public void testSummarizeUnion() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x relation{tuple{x 1, y 1.2}}, z \"falsefalse\"},\n" +
" tuple {x relation{tuple{x 2, y 1.2}}, z \"falsefalse\"},\n" +
" tuple {x relation{tuple{x 3, y 1.3}}, z \"truefalse\"},\n" +
" tuple {x relation{tuple{x 2, y 1.4}}, z \"truefalse\"},\n" +
" tuple {x relation{tuple{x 1, y 1.5}}, z \"truetrue\"},\n" +
" tuple {x relation{tuple{x 3, y 1.1}}, z \"truetrue\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a BY {z} : {unionOfx := UNION(x)}";
String result = "RELATION {z CHARACTER, unionOfx RELATION {x INTEGER, y RATIONAL}} {" +
"\n\tTUPLE {z \"falsefalse\", unionOfx RELATION {x INTEGER, y RATIONAL} {" +
"\n\tTUPLE {x 1, y 1.2}," +
"\n\tTUPLE {x 2, y 1.2}" +
"\n}}," +
"\n\tTUPLE {z \"truefalse\", unionOfx RELATION {x INTEGER, y RATIONAL} {" +
"\n\tTUPLE {x 3, y 1.3}," +
"\n\tTUPLE {x 2, y 1.4}" +
"\n}}," +
"\n\tTUPLE {z \"truetrue\", unionOfx RELATION {x INTEGER, y RATIONAL} {" +
"\n\tTUPLE {x 1, y 1.5}," +
"\n\tTUPLE {x 3, y 1.1}" +
"\n}}" +
"\n}";
testEquals(result, src);
}
@Test
public void testSummarizeXunion() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x relation{tuple{x 1, y 1.2}}, z \"falsefalse\"},\n" +
" tuple {x relation{tuple{x 2, y 1.2}}, z \"falsefalse\"},\n" +
" tuple {x relation{tuple{x 3, y 1.3}}, z \"truefalse\"},\n" +
" tuple {x relation{tuple{x 2, y 1.4}}, z \"truefalse\"},\n" +
" tuple {x relation{tuple{x 1, y 1.5}}, z \"truetrue\"},\n" +
" tuple {x relation{tuple{x 3, y 1.1}}, z \"truetrue\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a BY {z} : {unionOfx := XUNION(x)}";
String result = "RELATION {z CHARACTER, unionOfx RELATION {x INTEGER, y RATIONAL}} {" +
"\n\tTUPLE {z \"falsefalse\", unionOfx RELATION {x INTEGER, y RATIONAL} {" +
"\n\tTUPLE {x 1, y 1.2}," +
"\n\tTUPLE {x 2, y 1.2}" +
"\n}}," +
"\n\tTUPLE {z \"truefalse\", unionOfx RELATION {x INTEGER, y RATIONAL} {" +
"\n\tTUPLE {x 3, y 1.3}," +
"\n\tTUPLE {x 2, y 1.4}" +
"\n}}," +
"\n\tTUPLE {z \"truetrue\", unionOfx RELATION {x INTEGER, y RATIONAL} {" +
"\n\tTUPLE {x 1, y 1.5}," +
"\n\tTUPLE {x 3, y 1.1}" +
"\n}}" +
"\n}";
testEquals(result, src);
}
@Test
public void testSummarizeIntersect() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x relation{tuple{x 1, y 1.2}}, z \"falsefalse\"},\n" +
" tuple {x relation{tuple{x 1, y 1.2}}, z \"falsefalse\"},\n" +
" tuple {x relation{tuple{x 3, y 1.3}}, z \"truefalse\"},\n" +
" tuple {x relation{tuple{x 2, y 1.4}}, z \"truefalse\"},\n" +
" tuple {x relation{tuple{x 1, y 1.5}}, z \"truetrue\"},\n" +
" tuple {x relation{tuple{x 3, y 1.1}}, z \"truetrue\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a BY {z} : {intersectOfx := INTERSECT(x)}";
String result = "RELATION {z CHARACTER, intersectOfx RELATION {x INTEGER, y RATIONAL}} {" +
"\n\tTUPLE {z \"falsefalse\", intersectOfx RELATION {x INTEGER, y RATIONAL} {" +
"\n\tTUPLE {x 1, y 1.2}" +
"\n}}," +
"\n\tTUPLE {z \"truefalse\", intersectOfx RELATION {x INTEGER, y RATIONAL} {" +
"\n}}," +
"\n\tTUPLE {z \"truetrue\", intersectOfx RELATION {x INTEGER, y RATIONAL} {" +
"\n}}" +
"\n}";
testEquals(result, src);
}
// TODO - check this -- should it throw an exception for tuples with z = 'falsefalse'?
@Test
public void testSummarizeDUnion() {
String src =
"BEGIN;\n" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x relation{tuple{x 1, y 1.2}}, z \"falsefalse\"},\n" +
" tuple {x relation{tuple{x 1, y 1.2}}, z \"falsefalse\"},\n" +
" tuple {x relation{tuple{x 3, y 1.3}}, z \"truefalse\"},\n" +
" tuple {x relation{tuple{x 2, y 1.4}}, z \"truefalse\"},\n" +
" tuple {x relation{tuple{x 1, y 1.5}}, z \"truetrue\"},\n" +
" tuple {x relation{tuple{x 3, y 1.1}}, z \"truetrue\"}\n" +
"}) KEY {ALL BUT};\n" +
"END;\n" +
"SUMMARIZE a BY {z} : {unionOfx := D_UNION(x)}";
String result = "RELATION {z CHARACTER, unionOfx RELATION {x INTEGER, y RATIONAL}} {" +
"\n\tTUPLE {z \"falsefalse\", unionOfx RELATION {x INTEGER, y RATIONAL} {" +
"\n\tTUPLE {x 1, y 1.2}" +
"\n}}," +
"\n\tTUPLE {z \"truefalse\", unionOfx RELATION {x INTEGER, y RATIONAL} {" +
"\n\tTUPLE {x 3, y 1.3}," +
"\n\tTUPLE {x 2, y 1.4}" +
"\n}}," +
"\n\tTUPLE {z \"truetrue\", unionOfx RELATION {x INTEGER, y RATIONAL} {" +
"\n\tTUPLE {x 1, y 1.5}," +
"\n\tTUPLE {x 3, y 1.1}" +
"\n}}" +
"\n}";
testEquals(result, src);
}
@Test
public void testSmallDivideSimulated() {
String src =
"BEGIN;" +
"VAR r1 PRIVATE INIT(relation {" +
"tuple {A1 1}," +
"tuple {A1 2}," +
"tuple {A1 3}," +
"tuple {A1 4}," +
"tuple {A1 5}," +
"tuple {A1 6}," +
"tuple {A1 7}" +
"}) KEY {ALL BUT};" +
"VAR r2 PRIVATE INIT(relation {" +
"tuple {A2 \"test\"}," +
"tuple {A2 \"test\"}," +
"tuple {A2 \"glub\"}," +
"tuple {A2 \"glub\"}," +
"tuple {A2 \"test\"}," +
"tuple {A2 \"zot\"}," +
"tuple {A2 \"test\"}" +
"}) KEY {ALL BUT};" +
"VAR r3 PRIVATE INIT(relation {" +
"tuple {A1 1, A2 \"test\"}," +
"tuple {A1 2, A2 \"test\"}," +
"tuple {A1 3, A2 \"glub\"}," +
"tuple {A1 4, A2 \"glub\"}," +
"tuple {A1 5, A2 \"test\"}," +
"tuple {A1 6, A2 \"zot\"}," +
"tuple {A1 7, A2 \"test\"}" +
"}) KEY {ALL BUT};" +
"END;" +
"r1 {A1} MINUS ((r1 {A1} JOIN r2 {A2}) MINUS r3 {A1, A2}) {A1}";
testEquals("RELATION {A1 INTEGER} {\n}", src);
}
@Test
public void testGreatDivideSimulated() {
String src =
"BEGIN;" +
"VAR r1 PRIVATE INIT(relation {" +
"tuple {A1 1}," +
"tuple {A1 2}," +
"tuple {A1 3}," +
"tuple {A1 4}," +
"tuple {A1 5}," +
"tuple {A1 6}," +
"tuple {A1 7}" +
"}) KEY {ALL BUT};" +
"VAR r2 PRIVATE INIT(relation {" +
"tuple {A2 \"test\"}," +
"tuple {A2 \"test\"}," +
"tuple {A2 \"glub\"}," +
"tuple {A2 \"glub\"}," +
"tuple {A2 \"test\"}," +
"tuple {A2 \"zot\"}," +
"tuple {A2 \"test\"}" +
"}) KEY {ALL BUT};" +
"VAR r3 PRIVATE INIT(relation {" +
"tuple {A1 1, A3 4.5}," +
"tuple {A1 2, A3 2.5}," +
"tuple {A1 3, A3 3.2}," +
"tuple {A1 4, A3 4.5}," +
"tuple {A1 5, A3 5.2}," +
"tuple {A1 6, A3 3.1}," +
"tuple {A1 7, A3 4.5}" +
"}) KEY {ALL BUT};" +
"VAR r4 PRIVATE INIT(relation {" +
"tuple {A3 4.5, A2 \"test\"}," +
"tuple {A3 2.5, A2 \"test\"}," +
"tuple {A3 3.2, A2 \"glub\"}," +
"tuple {A3 4.5, A2 \"glub\"}," +
"tuple {A3 5.2, A2 \"test\"}," +
"tuple {A3 3.1, A2 \"zot\"}," +
"tuple {A3 4.5, A2 \"test\"}" +
"}) KEY {ALL BUT};" +
"END;" +
"WITH (r1p := r1 {A1}, r4p := r4 {A2, A3}) :" +
"(r1p JOIN r2 {A2}) MINUS ((r1p JOIN r4p) MINUS (r3 {A1, A3} JOIN r4p)) {A1, A2}";
testEquals("RELATION {A1 INTEGER, A2 CHARACTER} {\n\tTUPLE {A1 6, A2 \"zot\"}\n}", src);
}
@Test
public void testSmallDivide() {
String src =
"BEGIN;" +
"VAR r1 PRIVATE INIT(relation {" +
"tuple {A1 1}," +
"tuple {A1 2}," +
"tuple {A1 3}," +
"tuple {A1 4}," +
"tuple {A1 5}," +
"tuple {A1 6}," +
"tuple {A1 7}" +
"}) KEY {ALL BUT};" +
"VAR r2 PRIVATE INIT(relation {" +
"tuple {A2 \"test\"}," +
"tuple {A2 \"test\"}," +
"tuple {A2 \"glub\"}," +
"tuple {A2 \"glub\"}," +
"tuple {A2 \"test\"}," +
"tuple {A2 \"zot\"}," +
"tuple {A2 \"test\"}" +
"}) KEY {ALL BUT};" +
"VAR r3 PRIVATE INIT(relation {" +
"tuple {A1 1, A2 \"test\"}," +
"tuple {A1 2, A2 \"test\"}," +
"tuple {A1 3, A2 \"glub\"}," +
"tuple {A1 4, A2 \"glub\"}," +
"tuple {A1 5, A2 \"test\"}," +
"tuple {A1 6, A2 \"zot\"}," +
"tuple {A1 7, A2 \"test\"}" +
"}) KEY {ALL BUT};" +
"END;" +
"r1 DIVIDEBY r2 PER (r3)";
testEquals("RELATION {A1 INTEGER} {\n}", src);
}
@Test
public void testGreatDivide() {
String src =
"BEGIN;" +
"VAR r1 PRIVATE INIT(relation {" +
"tuple {A1 1}," +
"tuple {A1 2}," +
"tuple {A1 3}," +
"tuple {A1 4}," +
"tuple {A1 5}," +
"tuple {A1 6}," +
"tuple {A1 7}" +
"}) KEY {ALL BUT};" +
"VAR r2 PRIVATE INIT(relation {" +
"tuple {A2 \"test\"}," +
"tuple {A2 \"test\"}," +
"tuple {A2 \"glub\"}," +
"tuple {A2 \"glub\"}," +
"tuple {A2 \"test\"}," +
"tuple {A2 \"zot\"}," +
"tuple {A2 \"test\"}" +
"}) KEY {ALL BUT};" +
"VAR r3 PRIVATE INIT(relation {" +
"tuple {A1 1, A3 4.5}," +
"tuple {A1 2, A3 2.5}," +
"tuple {A1 3, A3 3.2}," +
"tuple {A1 4, A3 4.5}," +
"tuple {A1 5, A3 5.2}," +
"tuple {A1 6, A3 3.1}," +
"tuple {A1 7, A3 4.5}" +
"}) KEY {ALL BUT};" +
"VAR r4 PRIVATE INIT(relation {" +
"tuple {A3 4.5, A2 \"test\"}," +
"tuple {A3 2.5, A2 \"test\"}," +
"tuple {A3 3.2, A2 \"glub\"}," +
"tuple {A3 4.5, A2 \"glub\"}," +
"tuple {A3 5.2, A2 \"test\"}," +
"tuple {A3 3.1, A2 \"zot\"}," +
"tuple {A3 4.5, A2 \"test\"}" +
"}) KEY {ALL BUT};" +
"END;" +
"r1 DIVIDEBY r2 PER (r3, r4)";
testEquals("RELATION {A1 INTEGER, A2 CHARACTER} {\n\tTUPLE {A1 6, A2 \"zot\"}\n}", src);
}
@Test
public void testArray0() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"VAR ar ARRAY TUPLE {y RATIONAL, z CHARACTER, x INTEGER};\n" +
"LOAD ar FROM a ORDER();" +
"END;" +
"ar";
String expected = "ARRAY {y RATIONAL, z CHARACTER, x INTEGER} {" +
"\n\tTUPLE {y 4.5, z \"test\", x 1}," +
"\n\tTUPLE {y 2.5, z \"test\", x 2}," +
"\n\tTUPLE {y 3.2, z \"glub\", x 3}," +
"\n\tTUPLE {y 4.5, z \"glub\", x 4}," +
"\n\tTUPLE {y 5.2, z \"test\", x 5}," +
"\n\tTUPLE {y 3.1, z \"zot\", x 6}," +
"\n\tTUPLE {y 4.5, z \"test\", x 7}" +
"\n}";
testEquals(expected, src);
}
@Test
public void testArray1() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"VAR ar ARRAY TUPLE SAME_HEADING_AS (a);\n" +
"LOAD ar FROM a ORDER();" +
"END;" +
"ar";
testEquals("ARRAY {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 1, y 4.5, z \"test\"},\n\tTUPLE {x 2, y 2.5, z \"test\"},\n\tTUPLE {x 3, y 3.2, z \"glub\"},\n\tTUPLE {x 4, y 4.5, z \"glub\"},\n\tTUPLE {x 5, y 5.2, z \"test\"},\n\tTUPLE {x 6, y 3.1, z \"zot\"},\n\tTUPLE {x 7, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testArray2() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"VAR ar ARRAY TUPLE SAME_HEADING_AS (a);\n" +
"LOAD ar FROM a ORDER();" +
"END;" +
"COUNT(ar)";
testEquals("7", src);
}
@Test
public void testArray3() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"VAR ar ARRAY TUPLE SAME_HEADING_AS (a);\n" +
"LOAD ar FROM a ORDER();" +
"END;" +
"ar[3]";
testEquals("TUPLE {x 4, y 4.5, z \"glub\"}", src);
}
@Test
public void testArray4() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"VAR ar ARRAY TUPLE SAME_HEADING_AS (a);\n" +
"LOAD ar FROM a ORDER();\n" +
"VAR b PRIVATE SAME_TYPE_AS (a) KEY {ALL BUT};\n" +
"LOAD b FROM ar;" +
"END;" +
"b";
testEquals("RELATION {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 1, y 4.5, z \"test\"},\n\tTUPLE {x 2, y 2.5, z \"test\"},\n\tTUPLE {x 3, y 3.2, z \"glub\"},\n\tTUPLE {x 4, y 4.5, z \"glub\"},\n\tTUPLE {x 5, y 5.2, z \"test\"},\n\tTUPLE {x 6, y 3.1, z \"zot\"},\n\tTUPLE {x 7, y 4.5, z \"test\"}\n}", src);
}
@Test
public void testArray5() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 7, y 4.5, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"}\n" +
"}) KEY {ALL BUT};\n" +
"VAR ar ARRAY TUPLE SAME_HEADING_AS (a);\n" +
"LOAD ar FROM a ORDER (ASC y, DESC z);" +
"END;" +
"ar";
testEquals("ARRAY {x INTEGER, y RATIONAL, z CHARACTER} {\n\tTUPLE {x 2, y 2.5, z \"test\"},\n\tTUPLE {x 6, y 3.1, z \"zot\"},\n\tTUPLE {x 3, y 3.2, z \"glub\"},\n\tTUPLE {x 1, y 4.5, z \"test\"},\n\tTUPLE {x 7, y 4.5, z \"test\"},\n\tTUPLE {x 4, y 4.5, z \"glub\"},\n\tTUPLE {x 5, y 5.2, z \"test\"}\n}", src);
}
@Test
public void testArray6() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"VAR ar ARRAY TUPLE {y RATIONAL, z CHAR, x INTEGER};\n" +
"LOAD ar FROM a ORDER(ASC y, DESC z);" +
"END;" +
"ar";
testEquals("ARRAY {y RATIONAL, z CHARACTER, x INTEGER} {\n\tTUPLE {y 2.5, z \"test\", x 2},\n\tTUPLE {y 3.1, z \"zot\", x 6},\n\tTUPLE {y 3.2, z \"glub\", x 3},\n\tTUPLE {y 4.5, z \"test\", x 1},\n\tTUPLE {y 4.5, z \"test\", x 7},\n\tTUPLE {y 4.5, z \"glub\", x 4},\n\tTUPLE {y 5.2, z \"test\", x 5}\n}", src);
}
@Test
public void testArray7() {
String src =
"BEGIN;" +
"VAR a PRIVATE INIT(relation {\n" +
" tuple {x 1, y 4.5, z \"test\"},\n" +
" tuple {x 2, y 2.5, z \"test\"},\n" +
" tuple {x 3, y 3.2, z \"glub\"},\n" +
" tuple {x 4, y 4.5, z \"glub\"},\n" +
" tuple {x 5, y 5.2, z \"test\"},\n" +
" tuple {x 6, y 3.1, z \"zot\"},\n" +
" tuple {x 7, y 4.5, z \"test\"}\n" +
"}) KEY {ALL BUT};\n" +
"VAR ar ARRAY TUPLE {y RATIONAL, x INTEGER, z CHAR};\n" +
"LOAD ar FROM a ORDER();\n" +
"VAR b PRIVATE relation {z CHAR, y RATIONAL, x INTEGER} KEY {ALL BUT};\n" +
"LOAD b FROM ar;" +
"END;" +
"b";
String expectedResult =
"RELATION {z CHARACTER, y RATIONAL, x INTEGER} {" +
"\n\tTUPLE {z \"glub\", y 3.2, x 3}," +
"\n\tTUPLE {z \"glub\", y 4.5, x 4}," +
"\n\tTUPLE {z \"test\", y 2.5, x 2}," +
"\n\tTUPLE {z \"test\", y 4.5, x 1}," +
"\n\tTUPLE {z \"test\", y 4.5, x 7}," +
"\n\tTUPLE {z \"test\", y 5.2, x 5}," +
"\n\tTUPLE {z \"zot\", y 3.1, x 6}" +
"\n}";
testEquals(expectedResult, src);
}
@Test
public void testMultipleAssignment1() {
String src =
"BEGIN;" +
"VAR a INTEGER INIT(1);" +
"VAR b INTEGER INIT(2);" +
"VAR c INTEGER INIT(3);" +
"a := b + 1, b := a + 1, c := a + b;" +
"END;" +
"a + b + c";
testEquals("8", src);
}
@Test
public void testMultipleAssignment2() {
String src =
"BEGIN;" +
"VAR a INTEGER INIT(1);" +
"VAR b INTEGER INIT(2);" +
"VAR c INTEGER INIT(3);" +
"c := a + b, a := b + 1, b := a + 1;" +
"END;" +
"a + b + c";
testEquals("8", src);
}
@Test
public void testMultipleAssignment3() {
String src =
"BEGIN;" +
"VAR a INTEGER INIT(1);" +
"VAR b INTEGER INIT(2);" +
"VAR c INTEGER INIT(3);" +
"b := a + 1, c := a + b, a := b + 1;" +
"END;" +
"a + b + c";
testEquals("8", src);
}
@Test
public void testRelvar34() {
String src =
"BEGIN;" +
" var items private relation {id integer, name character} init(" +
" relation {" +
" tuple {id 1, name 'hi'}," +
" tuple {id 2, name 'lo'}," +
" tuple {id 3, name 'do'}" +
" }) key {id};" +
" var result private relation {r relation same_heading_as (items)} key {r};" +
" var inner private relation same_heading_as (items) key {id};" +
" insert inner relation {tuple from items where id = 1};" +
" insert result relation {tuple {r inner}};" +
"END;" +
"result";
String expected = "RELATION {r RELATION {id INTEGER, name CHARACTER}} {" +
"\n\tTUPLE {r RELATION {id INTEGER, name CHARACTER} {" +
"\n\tTUPLE {id 1, name \"hi\"}" +
"\n}}" +
"\n}";
testEquals(expected, src);
}
@Test
public void testRelvar35() {
String src =
"BEGIN;" +
" var x private relation {a integer, b relation {c integer}}" +
" init (relation {tuple {a 1, b relation {tuple {c 2}}}}) " +
" key {a};" +
" update x where a = 1 : {b := update b : {c := 33}};" +
"END;" +
"x";
String expected = "RELATION {a INTEGER, b RELATION {c INTEGER}} {" +
"\n\tTUPLE {a 1, b RELATION {c INTEGER} {" +
"\n\tTUPLE {c 33}" +
"\n}}" +
"\n}";
testEquals(expected, src);
}
@Test
public void testComplexExpression2() {
String src =
"begin;" +
" var myvar private relation {x INTEGER, y CHARACTER, z RATIONAL} key{x};" +
" myvar := RELATION {x INTEGER, y CHARACTER, z RATIONAL} {" +
" TUPLE {x 1, y \"zot\", z 3.4}," +
" TUPLE {x 2, y \"zap\", z 3.5}," +
" TUPLE {x 3, y \"zot\", z 3.4}" +
" };" +
"end;" +
"extend myvar : {a := 5, b := 3.2, c := tuple {x 1, y 2.3}}";
String expected =
"RELATION {x INTEGER, y CHARACTER, z RATIONAL, a INTEGER, b RATIONAL, c TUPLE {x INTEGER, y RATIONAL}} {" +
"\n\tTUPLE {x 1, y \"zot\", z 3.4, a 5, b 3.2, c TUPLE {x 1, y 2.3}}," +
"\n\tTUPLE {x 2, y \"zap\", z 3.5, a 5, b 3.2, c TUPLE {x 1, y 2.3}}," +
"\n\tTUPLE {x 3, y \"zot\", z 3.4, a 5, b 3.2, c TUPLE {x 1, y 2.3}}" +
"\n}";
testEquals(expected, src);
}
@Test
public void testRelvarInsert5() {
String src =
"begin;" +
" var myvar1 private relation {x integer, y rational} key {x};" +
" var myvar2 private relation {y rational, x integer} key {x};" +
" myvar2 := relation {tuple {x 1, y 2.3}, tuple {y 3.2, x 2}};" +
" insert myvar1 (myvar2 where x >= 2);" +
"end;" +
"myvar1";
String expected = "RELATION {x INTEGER, y RATIONAL} {" +
"\n\tTUPLE {x 2, y 3.2}" +
"\n}";
testEquals(expected, src);
}
@Test
public void testRelvarInsert6() {
String src =
"begin;" +
" var myvar1 private relation {x integer, y rational} key {x};" +
" var myvar2 private relation {y rational, x integer} key {x};" +
" myvar2 := relation {tuple {x 1, y 2.3}, tuple {y 3.2, x 2}};" +
" insert myvar1 update myvar2 : {x := x * 2, y := y * 10.0};" +
"end;" +
"myvar1";
String expected = "RELATION {x INTEGER, y RATIONAL} {" +
"\n\tTUPLE {x 2, y 23.0}," +
"\n\tTUPLE {x 4, y 32.0}" +
"\n}";
testEquals(expected, src);
}
@Test
public void testRelvarInsert7() {
String src =
"begin;" +
" var myvar1 private relation {y rational, x integer} key {x};" +
" var myvar2 private relation {x integer, y rational} key {x};" +
" myvar2 := relation {tuple {y 2.3, x 1}, tuple {x 2, y 3.2}};" +
" myvar1 := myvar2;" +
"end;" +
"myvar1";
String expected = "RELATION {y RATIONAL, x INTEGER} {" +
"\n\tTUPLE {y 2.3, x 1}," +
"\n\tTUPLE {y 3.2, x 2}" +
"\n}";
testEquals(expected, src);
}
@Test
public void testRelvarInsert9() {
String src =
"begin;" +
" var myvar1 private relation {x integer} key {x};" +
" var myvar2 private relation {x integer} key {x};" +
" myvar2 := relation {tuple {x 1}, tuple {x 2}};" +
" insert myvar1 (myvar2);" +
"end;" +
"myvar1";
String expected = "RELATION {x INTEGER} {" +
"\n\tTUPLE {x 1}," +
"\n\tTUPLE {x 2}" +
"\n}";
testEquals(expected, src);
}
@Test
public void testRelvarInsert10() {
String src =
"begin;" +
" var myvar1 private relation {x integer} key {x};" +
" var myvar2 private relation {x integer} key {x};" +
" myvar2 := relation {tuple {x 1}, tuple {x 2}};" +
"end;" +
"update myvar2 : {x := x * 2}";
String expected = "RELATION {x INTEGER} {" +
"\n\tTUPLE {x 2}," +
"\n\tTUPLE {x 4}" +
"\n}";
testEquals(expected, src);
}
@Test
public void testRelvarInsert11() {
String src =
"begin;" +
" var myvar1 private relation {x integer} key {x};" +
" var myvar2 private relation {x integer} key {x};" +
" myvar2 := relation {tuple {x 1}, tuple {x 2}};" +
" insert myvar1 update myvar2 : {x := x * 2};" +
"end;" +
"myvar1";
String expected = "RELATION {x INTEGER} {" +
"\n\tTUPLE {x 2}," +
"\n\tTUPLE {x 4}" +
"\n}";
testEquals(expected, src);
}
@Test
public void testPossrepInteger1() {
String src =
"THE_VALUE(THE_VALUE(1))";
String expected = "1";
testEquals(expected, src);
}
@Test
public void testPossrepInteger2() {
String src =
"THE_VALUE(1)";
String expected = "1";
testEquals(expected, src);
}
@Test
public void testPossrepInteger3() {
String src =
"THE_VALUE(INTEGER(1))";
String expected = "1";
testEquals(expected, src);
}
@Test
public void testPossrepInteger4() {
String src =
"INTEGER(INTEGER(1))";
String expected = "1";
testEquals(expected, src);
}
@Test
public void testPossrepInteger5() {
String src =
"THE_VALUE(INTEGER(1))";
String expected = "1";
testEquals(expected, src);
}
@Test
public void testPossrepInteger6() {
String src =
"INTEGER(1)";
String expected = "1";
testEquals(expected, src);
}
@Test
public void testPossrepInteger7() {
String src =
"THE_VALUE(1)";
String expected = "1";
testEquals(expected, src);
}
@Test
public void testPossrepIntegerBuiltin01() {
String src = "MAX(RELATION {TUPLE {x 1}, TUPLE {x 2}}, x)";
String expected = "2";
testEquals(expected, src);
}
@Test
public void testPossrepIntegerBuiltin02() {
String src = "SUM(RELATION {TUPLE {x 1}, TUPLE {x 2}}, x)";
String expected = "3";
testEquals(expected, src);
}
}