Ejemplo n.º 1
0
    def testQueryApiSyntax(self):
        """Test that we can generate the API query correctly."""
        w = query.WikidataQuery("http://example.com")

        qs = w.getQueryString(query.Link("enwiki"))
        self.assertEqual(qs, "q=link%5Benwiki%5D")

        self.assertEqual(w.getUrl(qs), "http://example.com/api?q=link%5Benwiki%5D")

        # check labels and props work OK
        qs = w.getQueryString(query.Link("enwiki"), ['en', 'fr'], ['prop'])
        self.assertEqual(qs, "q=link%5Benwiki%5D&labels=en,fr&props=prop")
Ejemplo n.º 2
0
    def testQuerySets(self):
        """Test that we can join queries together correctly."""
        # construct via queries
        qs = query.HasClaim(99, 100).AND(query.HasClaim(99, 101))

        self.assertEqual(str(qs), 'claim[99:100] AND claim[99:101]')

        self.assertEqual(repr(qs), 'QuerySet(claim[99:100] AND claim[99:101])')

        qs = query.HasClaim(99, 100).AND(query.HasClaim(99, 101)).AND(
            query.HasClaim(95))

        self.assertEqual(str(qs),
                         'claim[99:100] AND claim[99:101] AND claim[95]')

        # construct via queries
        qs = query.HasClaim(99, 100).AND(
            [query.HasClaim(99, 101),
             query.HasClaim(95)])

        self.assertEqual(str(qs),
                         'claim[99:100] AND claim[99:101] AND claim[95]')

        qs = query.HasClaim(99, 100).OR(
            [query.HasClaim(99, 101),
             query.HasClaim(95)])

        self.assertEqual(str(qs),
                         'claim[99:100] OR claim[99:101] OR claim[95]')

        q1 = query.HasClaim(99, 100)
        q2 = query.HasClaim(99, 101)

        # different joiners get explicit grouping parens (the api also allows
        # implicit, but we don't do that)
        qs1 = q1.AND(q2)
        qs2 = q1.OR(qs1).AND(query.HasClaim(98))

        self.assertEqual(
            str(qs2),
            '(claim[99:100] OR (claim[99:100] AND claim[99:101])) AND claim[98]'
        )

        # if the joiners are the same, no need to group
        qs1 = q1.AND(q2)
        qs2 = q1.AND(qs1).AND(query.HasClaim(98))

        self.assertEqual(
            str(qs2),
            'claim[99:100] AND claim[99:100] AND claim[99:101] AND claim[98]')

        qs1 = query.HasClaim(100).AND(query.HasClaim(101))
        qs2 = qs1.OR(query.HasClaim(102))

        self.assertEqual(str(qs2), '(claim[100] AND claim[101]) OR claim[102]')

        qs = query.Link("enwiki").AND(query.NoLink("dewiki"))

        self.assertEqual(str(qs), 'link[enwiki] AND nolink[dewiki]')
Ejemplo n.º 3
0
    def testQueries(self):
        """
        Test Queries and check whether they're behaving correctly.

        Check that we produce the expected query strings and that
        invalid inputs are rejected correctly
        """
        q = query.HasClaim(99)
        self.assertEqual(str(q), "claim[99]")

        q = query.HasClaim(99, 100)
        self.assertEqual(str(q), "claim[99:100]")

        q = query.HasClaim(99, [100])
        self.assertEqual(str(q), "claim[99:100]")

        q = query.HasClaim(99, [100, 101])
        self.assertEqual(str(q), "claim[99:100,101]")

        q = query.NoClaim(99, [100, 101])
        self.assertEqual(str(q), "noclaim[99:100,101]")

        q = query.StringClaim(99, "Hello")
        self.assertEqual(str(q), 'string[99:"Hello"]')

        q = query.StringClaim(99, ["Hello"])
        self.assertEqual(str(q), 'string[99:"Hello"]')

        q = query.StringClaim(99, ["Hello", "world"])
        self.assertEqual(str(q), 'string[99:"Hello","world"]')

        self.assertRaises(TypeError, lambda: query.StringClaim(99, 2))

        q = query.Tree(92, [1], 2)
        self.assertEqual(str(q), 'tree[92][1][2]')

        # missing third arg
        q = query.Tree(92, 1)
        self.assertEqual(str(q), 'tree[92][1][]')

        # missing second arg
        q = query.Tree(92, reverse=3)
        self.assertEqual(str(q), 'tree[92][][3]')

        q = query.Tree([92, 93], 1, [2, 7])
        self.assertEqual(str(q), 'tree[92,93][1][2,7]')

        # bad tree arg types
        self.assertRaises(TypeError, lambda: query.Tree(99, "hello"))

        q = query.Link("enwiki")
        self.assertEqual(str(q), 'link[enwiki]')

        q = query.NoLink(["enwiki", "frwiki"])
        self.assertEqual(str(q), 'nolink[enwiki,frwiki]')

        # bad link arg types
        self.assertRaises(TypeError, lambda: query.Link(99))
        self.assertRaises(TypeError, lambda: query.Link([99]))

        # HasClaim with tree as arg
        q = query.HasClaim(99, query.Tree(1, 2, 3))
        self.assertEqual(str(q), "claim[99:(tree[1][2][3])]")

        q = query.HasClaim(99, query.Tree(1, [2, 5], [3, 90]))
        self.assertEqual(str(q), "claim[99:(tree[1][2,5][3,90])]")