예제 #1
0
    def test_builtin_split(self):
        s.run("""Str(String a, String b, String c).
                 Str(a,b,c) :- (a,b,c) = $split("11::::22::33", "::", 3). """)

        a,b,c = s.query("Str(a,b,c)").first()
        self.assertEqual((a,b,c), ("11","","22::33"))

        s.clear("Str")

        s.run("""Str(a,b,c) :- (a,b,c) = $split("AA::BB::CC ::DD", "::", 3).""")
        a,b,c = s.query("Str(a,b,c)").first()
        self.assertEqual((a,b,c), ("AA","BB","CC ::DD"))
예제 #2
0
    def test_builtin_split(self):
        s.run("""Str(String a, String b, String c).
                 Str(a,b,c) :- (a,b,c) = $split("11::::22::33", "::", 3). """)

        a, b, c = s.query("Str(a,b,c)").first()
        self.assertEqual((a, b, c), ("11", "", "22::33"))

        s.clear("Str")

        s.run(
            """Str(a,b,c) :- (a,b,c) = $split("AA::BB::CC ::DD", "::", 3).""")
        a, b, c = s.query("Str(a,b,c)").first()
        self.assertEqual((a, b, c), ("AA", "BB", "CC ::DD"))
예제 #3
0
    def run_simple_rule(self):
        s.run("Qux(b, $sum(f)) :- Bar(a, f), Foo(a, b).")
        s.run("Sum(0, $sum(f)) :- Qux(b, f).")

        _, _sum = s.query("Sum(0, f)").first()

        self.assertEquals(_sum, 1945000.0)
예제 #4
0
    def test_simple_iteration(self):
        s.run("Qux(a, b) :- Foo(a, b).")
        expected = [(a, b) for a in xrange(0, 10) for b in xrange(40, 45)]
        result = []
        for a,b in s.query("Qux(a,b)"):
            result.append((a,b))

        self.assertEqual(sorted(result), sorted(expected))
예제 #5
0
    def test_multi_index(self):
        s.run("Qux(a, b) :- Foo(a, c), Baz(c, b).")
        expected = [(a,0) for a in xrange(0, 10)]
        result = []
        for a,b in s.query("Qux(a,b)"):
            result.append((a,b))

        self.assertEqual(sorted(result), sorted(expected))
예제 #6
0
    def test_multi_index2(self):
        s.run("Qux(a, c) :- Foo(a, c), Baz(c, a).")
        expected = [(0,42)]
        result = []
        for a,b in s.query("Qux(a,b)"):
            result.append((a,b))

        self.assertEqual(sorted(result), sorted(expected))
예제 #7
0
    def _testrun(self, query):
        s.run(query)

        expected = [(a, b) for a in range(150, 160) for b in range(42, 45)]
        result = []
        for a,b in s.query("Qux(a,b)"):
            result.append((a,b))

        self.assertEqual(sorted(result), sorted(expected))
예제 #8
0
    def _testrun(self, query):
        s.run(query)

        expected = [(a, 1, 1, 2) for a in xrange(42, 43)]
        result = []
        for a,b,c,d in s.query("Qux(a,b,c,d)"):
            result.append((a,b,c,d))

        self.assertEqual(sorted(result), sorted(expected))
예제 #9
0
    def test_groupby(self):
        s.run("Corge(a, $max(b)) :- Foo(b, a).")
        expected = [(42, 9), (41, 19)]

        result = []
        for a,b in s.query("Corge(a,b)"):
            result.append((a,b))

        self.assertEqual(sorted(result), sorted(expected))
예제 #10
0
    def test_simple_iteration(self):
        s.run("Qux(a, b) :- Foo(a, b).")
        expected = [(a,42) for a in xrange(0, 10)]
        expected.extend([(a,41) for a in xrange(10, 20)])
        result = []
        for a,b in s.query("Qux(a,b)"):
            result.append((a,b))

        self.assertEqual(sorted(result), sorted(expected))
예제 #11
0
    def test_sortby(self):
        s.run("Qux(a,b) :- Quux(a,b), b < 103.")
        expected = [(a, b) for a in xrange(44, 50) for b in xrange(101, 103)]

        result = []
        for a,b in s.query("Qux(a,b)"):
            result.append((a,b))

        self.assertEqual(sorted(result), sorted(expected))
예제 #12
0
    def test_sortby2(self):
        s.run("Qux(a,b) :- Quux(a,b), b >= 5.")
        expected = [(a,a) for a in xrange(5, 10)]

        result = []
        for a,b in s.query("Qux(a,b)"):
            result.append((a,b))

        self.assertEqual(sorted(result), sorted(expected))
예제 #13
0
    def test_aggr_trailing_args(self):
        s.run("Bar(a,b,$min(c), d) :- a=10, b=10, c=10, d=10.")
        s.run("Bar(a,b,$min(c), d) :- a=10, b=10, c=0, d=20.")

        expected = [(10, 10, 0, 20)]
        result = []
        for a, b, c, d in s.query("Bar(a,b,c,d)"):
            result.append((a, b, c, d))

        self.assertEqual(sorted(result), sorted(expected))
예제 #14
0
    def test_aggr_trailing_args(self):
        s.run("Bar(a,b,$min(c), d) :- a=10, b=10, c=10, d=10.")
        s.run("Bar(a,b,$min(c), d) :- a=10, b=10, c=0, d=20.")

        expected = [(10,10,0,20)]
        result = []
        for a,b,c,d in s.query("Bar(a,b,c,d)"):
            result.append((a,b,c,d))

        self.assertEqual(sorted(result), sorted(expected))
예제 #15
0
    def test_groupby(self):
        s.run("Corge(a, 0, $sum(b)) :- Foo(b, a).")
        expected = [(42, 0, sum(range(0, 20000))), (41, 0, sum(range(20000, 40000))), 
                    (21, 0, sum(range(40000,60000))), (91, 0, sum(range(60000, 80000)))]

        result = []
        for a,b,c in s.query("Corge(a,b,c)"):
            result.append((a,b,c))

        self.assertEqual(sorted(result), sorted(expected))
예제 #16
0
    def test_multiple_aggr(self):
        s.run("Bar(a,b,$min(c), $max(d)) :- a=10, b=10, c=20, d=10.")
        s.run("Bar(a,b,$min(c), $max(d)) :- a=10, b=10, c=10, d=20.")
        s.run("Bar(a,b,$min(c), $max(d)) :- a=10, b=10, c=10, d=30.")

        expected = [(10, 10, 10, 30)]
        result = []
        for a, b, c, d in s.query("Bar(a,b,c,d)"):
            result.append((a, b, c, d))

        self.assertEqual(sorted(result), sorted(expected))
예제 #17
0
    def test_groupby(self):
        s.run("Corge(a, 0, $max(b)) :- Foo(b, a).")
        s.run("Corge(a, 1, $min(b)) :- Foo(b, a).")
        expected = [(a, 0, 9) for a in xrange(40, 45)]
        expected.extend([(a, 1, 0) for a in xrange(40, 45)])

        result = []
        for a,b,c in s.query("Corge(a,b,c)"):
            result.append((a,b,c))

        self.assertEqual(sorted(result), sorted(expected))
예제 #18
0
    def test_multiple_aggr(self):
        s.run("Bar(a,$min(b), $max(c)) :- a=10, b=10, c=10.")
        s.run("Bar(a,$min(b), $max(c)) :- a=10, b=1, c=100.")
        s.run("Bar(a,$min(b), $max(c)) :- a=10, b=100, c=1.")

        expected = [(10, 1, 100)]
        result = []
        for a, b, c in s.query("Bar(a,b,c)"):
            result.append((a, b, c))

        self.assertEqual(sorted(result), sorted(expected))
예제 #19
0
    def test_aggr_trailing_args(self):
        s.run("Bar(a,$min(b), c) :- a=10, b=10, c=10.")
        s.run("Bar(a,$min(b), c) :- a=10, b=10, c=20.")
        s.run("Bar(a,$min(b), c) :- a=10, b=1, c=1.")

        expected = [(10, 1, 1)]
        result = []
        for a, b, c in s.query("Bar(a,b,c)"):
            result.append((a, b, c))

        self.assertEqual(sorted(result), sorted(expected))
예제 #20
0
    def test_aggr_trailing_args(self):
        s.run("Bar(a,$min(b), c) :- a=10, b=10, c=10.")
        s.run("Bar(a,$min(b), c) :- a=10, b=10, c=20.")
        s.run("Bar(a,$min(b), c) :- a=10, b=1, c=1.")

        expected = [(10,1, 1)]
        result = []
        for a,b,c in s.query("Bar(a,b,c)"):
            result.append((a,b,c))

        self.assertEqual(sorted(result), sorted(expected))
예제 #21
0
    def test_multiple_aggr(self):
        s.run("Bar(a,b,$min(c), $max(d)) :- a=10, b=10, c=20, d=10.")
        s.run("Bar(a,b,$min(c), $max(d)) :- a=10, b=10, c=10, d=20.")
        s.run("Bar(a,b,$min(c), $max(d)) :- a=10, b=10, c=10, d=30.")

        expected = [(10,10,10,30)]
        result = []
        for a,b,c,d in s.query("Bar(a,b,c,d)"):
            result.append((a,b,c,d))

        self.assertEqual(sorted(result), sorted(expected))
예제 #22
0
    def test_multiple_aggr(self):
        s.run("Bar(a,$min(b), $max(c)) :- a=10, b=10, c=10.")
        s.run("Bar(a,$min(b), $max(c)) :- a=10, b=1, c=100.")
        s.run("Bar(a,$min(b), $max(c)) :- a=10, b=100, c=1.")

        expected = [(10,1, 100)]
        result = []
        for a,b,c in s.query("Bar(a,b,c)"):
            result.append((a,b,c))

        self.assertEqual(sorted(result), sorted(expected))
예제 #23
0
    def test_aggr(self):
        s.run("Foo(a,b,$min(c)) :- a=10, b=10, c=30.")
        s.run("Foo(a,b,$min(c)) :- a=10, b=10, c=20.")
        s.run("Foo(a,b,$min(c)) :- a=10, b=10, c=10.")
        s.run("Foo(a,b,$min(c)) :- a=10, b=20, c=50.")
        s.run("Foo(a,b,$min(c)) :- a=10, b=20, c=20.")

        expected = [(10, 10, 10), (10, 20, 20)]
        result = []
        for a, b, c in s.query("Foo(a,b,c)"):
            result.append((a, b, c))
        self.assertEqual(sorted(result), sorted(expected))
예제 #24
0
    def test_min(self):
        s.run("Edge(s,t) :- s=0, t=1.")
        s.run("Edge(s,t) :- s=0, t=2.")
        s.run("Edge(s,t) :- s=0, t=3.")
        s.run("Edge(s,t) :- s=1, t=2.")
        s.run("Edge(s,t) :- s=1, t=3.")
        s.run("Edge(s,t) :- s=2, t=4.")
        s.run("Edge(s,t) :- s=4, t=5.")

        s.run("""Path(n,$min(d)) :- n=0, d=0;
                                 :- Path(s, d1), Edge(s,n), d=d1+1.""")
        self.assertEqual(s.query("Path(5, d)").first(), (5, 3))
예제 #25
0
    def test_min(self):
        s.run("Edge(s,t) :- s=0, t=1.")
        s.run("Edge(s,t) :- s=0, t=2.")
        s.run("Edge(s,t) :- s=0, t=3.")
        s.run("Edge(s,t) :- s=1, t=2.")
        s.run("Edge(s,t) :- s=1, t=3.")
        s.run("Edge(s,t) :- s=2, t=4.")
        s.run("Edge(s,t) :- s=4, t=5.")

        s.run("""Path(n,$min(d)) :- n=0, d=0;
                                 :- Path(s, d1), Edge(s,n), d=d1+1.""")
        self.assertEqual(s.query("Path(5, d)").first(), (5, 3))
예제 #26
0
    def test_aggr(self):
        s.run("Foo(a,b,$min(c)) :- a=10, b=10, c=30.")
        s.run("Foo(a,b,$min(c)) :- a=10, b=10, c=20.")
        s.run("Foo(a,b,$min(c)) :- a=10, b=10, c=10.")
        s.run("Foo(a,b,$min(c)) :- a=10, b=20, c=50.")
        s.run("Foo(a,b,$min(c)) :- a=10, b=20, c=20.")

        expected = [(10,10,10), (10,20,20)]
        result = []
        for a,b,c in s.query("Foo(a,b,c)"):
            result.append((a,b,c))
        self.assertEqual(sorted(result), sorted(expected))
예제 #27
0
    def test_aggr(self):
        s.run("Foo(a,$min(b)) :- a=10, b=20.")
        s.run("Foo(a,$min(b)) :- a=10, b=30.")
        s.run("Foo(a,$min(b)) :- a=10, b=10.")
        s.run("Foo(a,$min(b)) :- a=20, b=100.")
        s.run("Foo(a,$min(b)) :- a=20, b=10.")

        expected = [(10,10), (20, 10)]
        result = []
        for a,b in s.query("Foo(a,b)"):
            result.append((a,b))

        self.assertEqual(sorted(result), sorted(expected))
예제 #28
0
    def test_aggr(self):
        s.run("Foo(a,$min(b)) :- a=10, b=20.")
        s.run("Foo(a,$min(b)) :- a=10, b=30.")
        s.run("Foo(a,$min(b)) :- a=10, b=10.")
        s.run("Foo(a,$min(b)) :- a=20, b=100.")
        s.run("Foo(a,$min(b)) :- a=20, b=10.")

        expected = [(10, 10), (20, 10)]
        result = []
        for a, b in s.query("Foo(a,b)"):
            result.append((a, b))

        self.assertEqual(sorted(result), sorted(expected))