class TestGraphNt0(KnowledgeGraphTester):
    @pytest.fixture()
    def graph(self):
        return TablesKnowledgeGraph(os.path.join(DATA_PATH, 'nt-0.graph'))

    num_rows = 10
    columns = {
        'year', 'division', 'league', 'regular_season', 'playoffs', 'open_cup',
        'avg_attendance'
    }
    sample_original_strings = {
        'fb:row.row.year': 'Year',
        'fb:row.row.avg_attendance': 'Avg. Attendance',
        'fb:cell.2007': '2007',
        'fb:cell.3rd_usl_3rd': '3rd, USL (3rd)',
        'fb:part.western': 'Western',
        'fb:cell.does_not_exist': None,
        'fb:row.row.index': None,
        'N4': None,
    }
    symmetric_triples = [
        ({'fb:row.r1'}, 'fb:row.row.year', {'fb:cell.2001'}),
        ({'fb:row.r6', 'fb:row.r9',
          'fb:row.r10'}, 'fb:row.row.open_cup', {'fb:cell.3rd_round'}),
        ({'fb:row.r4', 'fb:row.r5', 'fb:row.r8'}, 'fb:row.row.open_cup',
         {'fb:cell.4th_round', 'fb:cell.1st_round'}),
        ({'fb:cell.7_169',
          'fb:cell.8_567'}, 'fb:cell.cell.number', {7169.0, 8567.0}),
        ({'fb:cell.2001', 'fb:cell.2002', 'fb:cell.2003'}, 'fb:cell.cell.date',
         {Date(2001, -1, -1),
          Date(2002, -1, -1),
          Date(2003, -1, -1)}),
        ({'fb:cell.3rd_usl_3rd'}, 'fb:cell.cell.num2', {3.0}),
        ({'fb:row.r4',
          'fb:row.r7'}, 'fb:row.row.next', {'fb:row.r5', 'fb:row.r8'}),
        ({'fb:row.r3', 'fb:row.r10',
          'fb:row.r4'}, 'fb:row.row.index', {3.0, 10.0, 4.0}),
    ]
    join_triples = [
        ({'fb:row.r2'}, 'fb:row.row.next',
         {'fb:row.r3', 'fb:row.r42', 'fb:row.r1'}),
        ({'fb:row.r3',
          'fb:row.r5'}, 'fb:row.row.index', {3.0, 5.0, 3.14, '4.0'}),
        #({'fb:row.r{}'.format(x) for x in xrange(1, 11)}, 'fb:type.object.type', {'fb:type.row'}),     # Not supported anymore; use `type-row` instead
        ({'fb:row.r{}'.format(x)
          for x in xrange(1, 11)
          if x != 5}, 'fb:row.row.index', NeqInfiniteSet(5.0)),
        ({'fb:row.r{}'.format(x)
          for x in xrange(1, 11)
          if x != 5}, 'fb:row.row.year', NeqInfiniteSet('fb:cell.2005')),
        ({'fb:cell.2003', 'fb:cell.2004',
          'fb:cell.2005'}, 'fb:cell.cell.number',
         RangeInfiniteSet('>=', 2003.0, '<', 2006.0)),
        ({'fb:cell.2003', 'fb:cell.2004', 'fb:cell.2005'}, 'fb:cell.cell.date',
         RangeInfiniteSet('>=', Date(2003, -1, -1), '<', Date(2006, -1, -1))),
    ]
    reversed_join_triples = [
        ({'fb:cell.1st_western', 'fb:5th', 'fb:row.row.year'},
         'fb:cell.cell.part', {'fb:part.1st', 'fb:part.western'}),
    ]
 def test_date_range(self):
     a = RangeInfiniteSet('>', Date(2010, 2, 14), '<=', Date(2011, 12, 1))
     assert Date(2010, 2, 13) not in a
     assert Date(2010, 2, 14) not in a
     assert Date(2010, 2, 15) in a
     assert Date(2010, 3, 1) in a
     assert Date(2011, 2, 1) in a
     assert Date(2011, 12, 1) in a
     assert Date(2012, 5, 7) not in a
 def test_parse_value(self):
     assert parse_number('2.3') == 2.3
     assert parse_number('-4') == -4
     with pytest.raises(Exception):
         parse_number('3.45m')
     assert parse_date('1961-08-04') == Date(1961, 8, 4)
     assert parse_date('XXXX-12-xx') == Date(-1, 12, -1)
     with pytest.raises(Exception):
         parse_date('xx-xx-xx')
     assert parse_value('10') == 10.0
     assert parse_value('-3.14') == -3.14
     assert parse_value('xx-8-24') == Date(-1, 8, 24)
     assert parse_value('40 kg') == '40 kg'
     assert parse_value('xx-xx-xx') == 'xx-xx-xx'
 def test_neq(self):
     a = NeqInfiniteSet(3.0)
     assert 3.0 not in a
     assert 6.0 in a
     assert Date(2010, 1, 2) not in a
     assert 'fb:cell.puppy' not in a
     a = NeqInfiniteSet(Date(2010, 1, 2))
     assert 3.0 not in a
     assert Date(2010, 1, 2) not in a
     assert Date(2010, -1, 2) in a
     assert 'fb:cell.puppy' not in a
     a = NeqInfiniteSet('fb:cell.puppy')
     assert 'fb:cell.puppy' not in a
     assert 'fb:cell.kitten' in a
     assert 'fb:part.robot' not in a
 def test_basic_range(self):
     a = RangeInfiniteSet('>', 4.0)
     assert 2.0 not in a
     assert 4.0 not in a
     assert 8.0 in a
     assert Date(2010, -1, -1) not in a
     a = RangeInfiniteSet('>=', 4.0)
     assert 2.0 not in a
     assert 4.0 in a
     assert 8.0 in a
     a = RangeInfiniteSet('<', 4.0)
     assert 2.0 in a
     assert 4.0 not in a
     assert 8.0 not in a
     a = RangeInfiniteSet('<=', 4.0)
     assert 2.0 in a
     assert 4.0 in a
     assert 8.0 not in a
     a = RangeInfiniteSet('>', 4.0, '<=', 8.0)
     assert 2.0 not in a
     assert 4.0 not in a
     assert 6.0 in a
     assert 8.0 in a
     assert 10.0 not in a
     assert 'fb:cell.obama' not in a
 def test_ensure_same_type(self):
     assert ensure_same_type({4.0}) == 'N'
     assert ensure_same_type({
         'fb:cell.puppy': {4.0},
         'fb:cell.kitten': {6.0, 7.0}
     }) == 'N'
     assert ensure_same_type({
         Date(2010, 1, 2): {4.0},
         'fb:cell.kitten': {6.0, 7.0}
     }) == 'N'
     assert ensure_same_type({4.0, 5.0, 20.0, -2.5}) == 'N'
     assert ensure_same_type({4.0, 5.0, 20.0, -2.5}, 'N') == 'N'
     assert ensure_same_type({4.0, 5.0, 20.0, -2.5}, ['D', 'N']) == 'N'
     assert ensure_same_type({Date(-1, 11, 14), Date(-1, 12, 3)}) == 'D'
     assert ensure_same_type({'fb:cell.puppy',
                              'fb:cell.kitten'}) == 'fb:cell'
     assert ensure_same_type({'fb:cell.puppy', 'fb:cell.kitten'},
                             'fb:cell') == 'fb:cell'
     assert ensure_same_type(
         {x: {(x * 1.)**y
              for y in xrange(x)}
          for x in [2, 3, 5, 7]}) == 'N'
     assert ensure_same_type({
         x: {'fb:hello.' + str(y)
             for y in xrange(x)}
         for x in [2, 3, 5, 7]
     }) == 'fb:hello'
     with pytest.raises(ValueError):
         ensure_same_type('4.0')
     with pytest.raises(ValueError):
         ensure_same_type(set())
     with pytest.raises(ValueError):
         ensure_same_type(set(), 'N')
     with pytest.raises(ValueError):
         ensure_same_type({4.0: set(), 5.0: set()}, 'D')
     with pytest.raises(ValueError):
         ensure_same_type({4.0: {5.0}, 6.0: {2.0, 'fb:cell.kitten'}})
     with pytest.raises(ValueError):
         ensure_same_type({'fb:row.row.name'})
     with pytest.raises(ValueError):
         ensure_same_type({2.25, 4.6, -5}, 'D')
     with pytest.raises(ValueError):
         ensure_same_type({
             'fb:part.puppy': {1.2},
             'fb:cell.kitten': {2.4}
         }, ['D', 'fb:cell'])
 def test_get_type(self):
     assert get_type(4.0) == 'N'
     assert get_type(Date(-1, -1, 2)) == 'D'
     assert get_type('fb:cell.puppy') == 'fb:cell'
     with pytest.raises(Exception):
         get_type('argmax')
     with pytest.raises(Exception):
         get_type('fb:row.row.name')
 def test_operations(self, executor):
     e = executor
     # aggregates
     d = self.run(
         e, 'fb:cell.usl_a_league fb:row.row.league '
         '!fb:row.row.avg_attendance !fb:cell.cell.number')
     self.run(e, 'sum', d, [{24928.0}])
     self.run(e, 'avg', d, [{6232.0}])
     self.run(e, 'min', d, [{5628.0}])
     self.run(e, 'max', d, [{7169.0}])
     self.run(e, 'count', d, [{4.0}])
     self.run(
         e, 'fb:cell.usl_a_league fb:row.row.league '
         '!fb:row.row.division count', None, [{1.0}])
     d = self.run(
         e, 'fb:cell.usl_a_league fb:row.row.league '
         '!fb:row.row.avg_attendance')
     self.run_error(e, 'sum', d)
     d = self.run(e, 'type-row !fb:row.row.year !fb:cell.cell.date')
     self.run(e, 'min', d, [{Date(2001, -1, -1)}])
     self.run(e, 'max', d, [{Date(2010, -1, -1)}])
     self.run(e, 'count', d, [{10.0}])
     # merge
     d = self.run(
         e, 'fb:cell.usl_a_league fb:row.row.league '
         'fb:cell.quarterfinals fb:row.row.playoffs')
     self.run(e, 'and', d, [{'fb:row.r1', 'fb:row.r4'}])
     self.run(e, 'or count', d, [{6.0}])
     self.run(e, 'type-row N3 fb:row.row.index != and count', None, [{9.0}])
     self.run(
         e, 'type-row !fb:row.row.avg_attendance !fb:cell.cell.number '
         'N6000 > N8000 < and and count', None, [{4.0}])
     # diff
     self.run(
         e, 'N11 fb:cell.2001 fb:row.row.year '
         '!fb:row.row.regular_season !fb:cell.cell.number diff', None,
         [{7.0}])
     self.run(
         e, 'fb:cell.2001 fb:cell.2004 or fb:row.row.year '
         '!fb:row.row.regular_season !fb:cell.cell.number N3 diff', None,
         [{1.0, 2.0}])
 def test_generic_date_and(self):
     a = GenericDateInfiniteSet(Date(-1, 4, -1))
     assert a & {Date(2010, 4, 2), Date(2010, 5, 3), Date(2011, 4, 7)} == \
             {Date(2010, 4, 2), Date(2011, 4, 7)}
     assert {Date(2010, 4, 2), Date(2010, 5, 3), Date(2011, 4, 7)} & a== \
             {Date(2010, 4, 2), Date(2011, 4, 7)}
 def test_generic_date(self):
     a = GenericDateInfiniteSet(Date(2010, 4, -1))
     assert Date(2010, 4, 2) in a
     assert Date(2010, 5, 3) not in a
     assert Date(2010, -1, -1) not in a
     assert 4.0 not in a
     assert a.min_() == Date(2010, 4, 1)
     assert a.max_() == Date(2010, 4, 30)
     a = GenericDateInfiniteSet(Date(-1, 4, 20))
     assert Date(2010, 4, 20) in a
     assert Date(2010, 5, 20) not in a
     assert Date(-1, 4, -1) not in a
     assert 4.0 not in a
     assert a.min_() == a.max_() == Date(-1, 4, 20)
 def test_date(self):
     assert Date(2012, 12, -1) == Date(2012, 12, -1)
     assert len({Date(-1, 4, 14), Date(-1, 4, 14)}) == 1
     with pytest.raises(Exception):
         Date(-1, -1, -1)
     with pytest.raises(Exception):
         Date(1990, 0, 12)
     with pytest.raises(Exception):
         Date(1990, 4, 32)
     assert Date(2012, 8, -1) < Date(2012, 12, 4)
     # Not sure if this is the behavior we want ...
     assert Date(-1, 8, 24) < Date(2012, 8, 29)
     with pytest.raises(Exception):
         # Cannot compare across types
         Date(1984, -1, -1) > 1985.0
 def test_neq_and(self):
     assert NeqInfiniteSet(3.0) & {3.0, 4.0, Date(2010, 1, 2)} == {4.0}
     assert {3.0, 4.0, Date(2010, 1, 2)} & NeqInfiniteSet(3.0) == {4.0}
     assert NeqInfiniteSet(Date(2010, -1, 2)) & \
             {3.0, 4.0, Date(2010, 1, 2), Date(2010, -1, 2), Date(2010, -1, -1)} == \
             {Date(2010, 1, 2), Date(2010, -1, -1)}