예제 #1
0
class ConditionSetTest(unittest.TestCase):

    def setUp(self):
        self.df = pd.read_csv(RSC_DIR + '/census.csv')
        with open(RSC_DIR + '/schema_census') as f:
            schema = json.loads(f.read())

        self.schema = OrderedDict(attributes=schema['attributes'], index=schema['index'])
        self.table = Table('census', self.schema).data(self.df)

        self.table.add_column('fake_cat', 'CATEGORICAL')
        items = self.table.index_items()
        fake_cat = ['C1','C2','C3','C4']
        self.fake_sets = {}
        for k in fake_cat:
            self.fake_sets.setdefault(k, [])
        for i, item in enumerate(items):
            self.table.update({'State':item}, {'$set': {'fake_cat': fake_cat[i % 4]}})
            self.fake_sets[fake_cat[i % 4]].append(item)

    def tearDown(self):
        names.clear()

    def testCreation(self):
        cs = ConditionSet(name='condition_set', data=self.table, setop='AND')
        self.assertEqual(cs.is_empty(), True)
        self.assertEqual(cs.reference, [])
        self.assertEqual(cs.query, {'State': {'$in': []}})
        self.assertEqual(cs.projection, {})

    def testAddCondition(self):
        cs = ConditionSet(name='condition_set', data=self.table, setop='AND')
        cc = CategoricalCondition(data=self.table, attr='fake_cat')
        cs.add_condition(cc)
        cc.add_category('C1')
        self.assertItemsEqual(cs.reference, self.fake_sets['C1'])
        cc.add_category(['C1', 'C3'])
        c1_and_c3 = self.fake_sets['C1'][:]
        c1_and_c3 += self.fake_sets['C3']
        self.assertItemsEqual(cs.reference, c1_and_c3)

    def testAddSeveralConditions(self):
        cs = ConditionSet(name='condition_set', data=self.table, setop='AND')
        cc = CategoricalCondition(data=self.table, attr='fake_cat')
        rc = RangeCondition(data=self.table, attr='Information')
        rc.set_range(0.5, relative=True)

        cs.add_condition(cc)
        cc.add_category('C1')
        self.assertItemsEqual(cs.reference, self.fake_sets['C1'])

        cs.add_condition(rc)
        self.assertItemsEqual(cs.reference, ['CA'])

        cc.toggle_category(['C1', 'C3'])
        self.assertItemsEqual(cs.reference, ['NY'])

        rc.set_range(0, 1, relative=True)
        self.assertItemsEqual(cs.reference, self.fake_sets['C3'])

    def testRemoveCondition(self):
        cs = ConditionSet(name='condition_set', data=self.table, setop='AND')
        cc = CategoricalCondition(data=self.table, attr='fake_cat')
        cs.add_condition(cc)
        cc.add_category('C1')
        self.assertItemsEqual(cs.reference, self.fake_sets['C1'])
        cs.remove_condition(cc)
        self.assertEqual(cs.reference, [])

    def testEnablingChanges(self):
        cs = ConditionSet(name='condition_set', data=self.table, setop='AND')
        cc = CategoricalCondition(data=self.table, attr='fake_cat')
        rc = RangeCondition(data=self.table, attr='Information')
        rc.set_range(0.5, relative=True)

        cs.add_condition(cc)
        cc.add_category('C1')
        self.assertItemsEqual(cs.reference, self.fake_sets['C1'])
        cc.disable()
        print cs.query, cs.reference
        self.assertItemsEqual(cs.reference, [])

        cs.add_condition(rc)
        self.assertItemsEqual(cs.reference, ['CA', 'NY'])
        rc.enable(False)
        cc.enable()
        self.assertItemsEqual(cs.reference, self.fake_sets['C1'])

        cc.toggle_category(['C1', 'C3'])
        rc.enable()
        self.assertItemsEqual(cs.reference, ['NY'])

        rc.set_range(0, 1, relative=True)
        self.assertItemsEqual(cs.reference, self.fake_sets['C3'])


    def testGrammar(self):
        cs = ConditionSet(name='condition_set', data=self.table, setop='AND')
        cc = CategoricalCondition(data=self.table, attr='fake_cat', name='catc')
        rc = RangeCondition(data=self.table, attr='Information', name='rangec')
        ac = AttributeCondition(data=self.table, name='attrc')
        cs.add_condition(cc)
        cs.add_condition(rc)
        cs.add_condition(ac)

        print cs.grammar
        self.maxDiff = None
        self.assertDictEqual(cs.grammar, {'setop': 'AND',
                                          'conditions': ['rangec','catc','attrc'],
                                          'data': 'census',
                                          'name': 'condition_set'})
예제 #2
0
class CategoricalTest(unittest.TestCase):

    def setUp(self):
        self.df = pd.read_csv(RSC_DIR+'/census.csv')
        with open(RSC_DIR+'/schema_census') as f:
            schema = json.loads(f.read())

        self.schema = OrderedDict(attributes = schema['attributes'], index = schema['index'])
        self.table = Table('census', self.schema).data(self.df)

        self.table.add_column('fake_cat', 'CATEGORICAL')
        items = self.table.index_items()
        fake_cat = ['C1','C2','C3','C4']
        for i, item in enumerate(items):
            self.table.update({'State':item}, {'$set': {'fake_cat': fake_cat[ i % 4]}})

    def tearDown(self):
        names.clear()

    def testCreation(self):
        cc = CategoricalCondition(data=self.table, attr='fake_cat')
        self.assertEqual(cc.included_categories(), [])

        with self.assertRaises(NotImplementedError):
            cc = CategoricalCondition(data=self.table, attr='Information')

    def testAdd(self):
        cc = CategoricalCondition(data=self.table, attr='fake_cat')
        cc.add_category('C1')
        self.assertEqual(set(cc.included_categories()), set(['C1']))
        cc.add_category(['C1', 'C3'])
        self.assertEqual(set(cc.included_categories()), set(['C1', 'C3']))

    def testRemove(self):
        cc = CategoricalCondition(data=self.table, attr='fake_cat')
        cc.add_category(['C1', 'C3'])
        cc.remove_category('C1')
        self.assertEqual(set(cc.included_categories()), set(['C3']))

    def testToggleItem(self):
        cc = CategoricalCondition(data=self.table, attr='fake_cat')
        cc.add_category(['C1', 'C3'])
        cc.toggle_category('C1')
        cc.toggle_category('C2')
        self.assertEqual(set(cc.included_categories()), set(['C3', 'C2']))
        cc.toggle_category(['C2','C4'])
        self.assertEqual(set(cc.included_categories()), set(['C3', 'C4']))

    def testIncludeAll(self):
        cc = CategoricalCondition(data=self.table, attr='fake_cat')
        cc.include_all()
        self.assertSetEqual(set(cc.included_categories()),
                            set(self.table.distinct('fake_cat')))

    def testExcludeAll(self):
        cc = CategoricalCondition(data=self.table, attr='fake_cat')
        cc.add_category('C1')
        cc.exclude_all()
        self.assertEqual(cc.included_categories(),[])

    def testToggle(self):
        cc = CategoricalCondition(data=self.table, attr='fake_cat')
        cc.add_category('C1')
        cc.toggle()
        self.assertEqual(set(cc.included_categories()), set(['C2', 'C3', 'C4']))

    def testIncludedItems(self):
        cc = CategoricalCondition(data=self.table, attr='fake_cat')
        cc.add_category('C1')
        self.assertSetEqual(set(cc.included_items()),
                         set(['AK', 'CA', 'DE', 'IA', 'KS', 'MD', 'MO',
                           'ND', 'NM', 'OK', 'SC', 'UT', 'WI']))
        cc.add_category(['C2', 'C3', 'C4'])
        self.assertSetEqual(set(cc.included_items()), set(self.table.distinct('State')))

    def testExcludedItems(self):
        cc = CategoricalCondition(data=self.table, attr='fake_cat')
        cc.add_category(['C2', 'C3', 'C4'])
        self.assertSetEqual(set(cc.excluded_items()),
                         set(['AK', 'CA', 'DE', 'IA', 'KS', 'MD', 'MO',
                           'ND', 'NM', 'OK', 'SC', 'UT', 'WI']))
        cc.add_category('C1')
        self.assertSetEqual(set(cc.excluded_items()), set([]))
예제 #3
0
class RootTest(unittest.TestCase):

    def setUp(self):
        self.root = Root("root")
        self.root2 = Root("root2")

        self.createTable()
        self.createConditions()
        self.createDynamics()
        self.createSharedObject()

    def tearDown(self):
        names.clear()

    def createTable(self):
        self.df = pd.read_csv(RSC_DIR + '/census.csv')
        with open(RSC_DIR + '/schema_census') as f:
            schema = json.loads(f.read())

        self.schema = OrderedDict(attributes=schema['attributes'], index=schema['index'])
        self.table = Table('census', self.schema).data(self.df)

        self.table.add_column('fake_cat', 'CATEGORICAL')
        items = self.table.index_items()
        fake_cat = ['C1','C2','C3','C4']
        for i, item in enumerate(items):
            self.table.update({'State':item}, {'$set': {'fake_cat': fake_cat[i % 4]}})

        self.root.add_dataset(self.table)

    def createConditions(self):
        self.categorical_condition = CategoricalCondition(data=self.table, attr='fake_cat')
        self.range_condition = RangeCondition(data=self.table, attr='Information',
                                              range=dict(min=250000, max=500000))
        self.query_condition = QueryCondition(data=self.table, query={'State':'NY'})
        self.attribute_condition = AttributeCondition(data=self.table, attributes=['Information'])

        self.consition_set = ConditionSet(name='condition_set', data=self.table, setop='AND')
        self.consition_set.add_condition(self.categorical_condition)
        self.consition_set.add_condition(self.range_condition)
        self.consition_set.add_condition(self.query_condition)
        self.consition_set.add_condition(self.attribute_condition)

        self.root.add_condition(self.categorical_condition)
        self.root.add_condition(self.range_condition)
        self.root.add_condition(self.query_condition)
        self.root.add_condition(self.attribute_condition)

    def createDynamics(self):
        self.filter1 = DynFilter("filer1", self.table)
        self.filter1.add_condition(self.range_condition)

        self.filter2 = DynFilter("filer2", self.table)
        self.filter2.add_condition(self.query_condition)
        self.filter2.add_condition(self.attribute_condition)

        self.selection = DynSelect("selection", self.table)
        self.selection.add_condition(self.categorical_condition)

        self.root.add_dynamic(self.filter1)
        self.root.add_dynamic(self.filter2)
        self.root.add_dynamic(self.selection)

    def createSharedObject(self):
        self.shared_object = SharedObject("shared_object", {'a':42, 'b':[1,2,3,4]})

        self.root.add_dataset(self.shared_object)

    def testCreation(self):
        from pprint import pprint
        grammar = self.root.grammar
        pprint(grammar)

        names.clear()
        objects = Root.build(grammar)

        self.assertIn(self.table.name, objects)
        self.assertIn(self.attribute_condition.name, objects)
        self.assertIn(self.categorical_condition.name, objects)
        self.assertIn(self.range_condition.name, objects)
        self.assertIn(self.query_condition.name, objects)
        self.assertIn(self.filter1.name, objects)
        self.assertIn(self.filter2.name, objects)
        self.assertIn(self.selection.name, objects)
        self.assertIn(self.shared_object.name, objects)

        self.assertIsInstance(self.table, Table)
        self.assertIsInstance(self.attribute_condition, AttributeCondition)
        self.assertIsInstance(self.categorical_condition, CategoricalCondition)
        self.assertIsInstance(self.range_condition, RangeCondition)
        self.assertIsInstance(self.query_condition, QueryCondition)
        self.assertIsInstance(self.filter1, DynFilter)
        self.assertIsInstance(self.filter2, DynFilter)
        self.assertIsInstance(self.selection, DynSelect)
        self.assertIsInstance(self.shared_object, SharedObject)