Пример #1
0
    def testViewVariables(self):
        "Test: variable usage in views"

        view_def = '''
        CREATE VIEW view_name
        AS SELECT node.a1 = (node.a3 - node.a1) * var_a,
                  node.a2 = node.a1 + node.a2,
                  node.a3 = 2 * node.a5 + node.a3,
                  node.a5,
                  node.a_new = var_a
        RANKED lowest(var_a*2, var_a*node.a3*(node.a5^2)+1)
        FROM db
        WITH var_a = 5
        '''

        where_clause = '''
        WHERE node.a3
           or (1+2*round(node.a1,2) = .1E5+4.E-4)
           or node.a1 == 1 and node.a2 == "test"
           or 1+node.a1 <> 4
        '''

        create       = view_def + ';'
        create_where = view_def + where_clause + ';'

        attr_names = [ 'a%s' % i for i in range(1,10) ]

        db = self.db
        for i in range(9):
            db.addAttribute(attr_names[i], int)

        for a5 in range(-100,100):
            node = DBNode(db)
            for i in range(9):
                setattr(node, attr_names[i], i+1)
            node.a5 = a5
            db.addNode(node)


        sview0 = NodeView( parse_view_spec(create.replace('view_name', 'sview0')), self.viewreg )

        self.assertEqual(len(sview0.getBucket()), len(sview0))

        some_node = sview0.getBucket()[0]
        a1_of_some_node = some_node.a1

        self.assertEqual(2*5, len(sview0))
        sview0.setVariable('var_a', 8)
        self.assertEqual(2*8, len(sview0))

        some_node = sview0.getBucket()[0]
        self.assertNotEqual(a1_of_some_node, some_node.a1)

        sview1 = NodeView( parse_view_spec(create_where.replace('view_name', 'sview1')), self.viewreg )

        self.assertEqual(2* 5, len(sview1))
        sview1.setVariable('var_a', 16)
        self.assertEqual(2*16, len(sview1))
        self.assertEqual(2* 8, len(sview0))

        create_subview = create_where.replace('FROM db', 'FROM sview0')
        sview2 = NodeView( parse_view_spec(create_subview.replace('view_name', 'sview2')), self.viewreg )

        sview2.setVariable('var_a', 1000)
        self.assertEqual(2*8,  len(sview0))
        self.assertEqual(2*8,  len(sview2))
        self.assertEqual(2*16, len(sview1))