[Checkins] SVN: Sandbox/adamg/ocql/trunk/src/ocql/ add more tests to improve coverage in parser

Charith Paranaliyanage paranaliyanage at gmail.com
Fri Aug 22 14:55:59 EDT 2008


Log message for revision 90134:
  add more tests to improve coverage in parser

Changed:
  U   Sandbox/adamg/ocql/trunk/src/ocql/parser/parser.txt
  U   Sandbox/adamg/ocql/trunk/src/ocql/parser/queryparser.py
  U   Sandbox/adamg/ocql/trunk/src/ocql/queryobject/interfaces.py
  U   Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.py
  U   Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.txt
  U   Sandbox/adamg/ocql/trunk/src/ocql/rewriter/rewriter.py
  U   Sandbox/adamg/ocql/trunk/src/ocql/rewriter/rewriter.txt
  U   Sandbox/adamg/ocql/trunk/src/ocql/testing/database.py

-=-
Modified: Sandbox/adamg/ocql/trunk/src/ocql/parser/parser.txt
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/parser/parser.txt	2008-08-22 17:02:39 UTC (rev 90133)
+++ Sandbox/adamg/ocql/trunk/src/ocql/parser/parser.txt	2008-08-22 18:55:58 UTC (rev 90134)
@@ -42,6 +42,9 @@
     >>> QueryParser("set [ i in ICourse | i ]")(None)
     Head(Query(<type 'set'>, In(Identifier(i), Identifier(ICourse)), Identifier(i)))
 
+    >>> QueryParser("set [ i for i in ICourse ]")(None)
+    Head(Query(<type 'set'>, In(Identifier(i), Identifier(ICourse)), Identifier(i)))
+
     >>> QueryParser("list [ i in ICourse | i ]")(None)
     Head(Query(<type 'list'>, In(Identifier(i), Identifier(ICourse)), Identifier(i)))
 
@@ -72,6 +75,9 @@
     >>> QueryParser("set [ c in ICourse; c.credits <= 3 | c.code ]")(None)
     Head(Query(<type 'set'>, In(Identifier(c), Identifier(ICourse)); Le(Property(Identifier(c), Identifier(credits)), Constant(3)), Property(Identifier(c), Identifier(code))))
 
+    >>> QueryParser("set [ c in ICourse; c.credits != 3 | c.code ]")(None)
+    Head(Query(<type 'set'>, In(Identifier(c), Identifier(ICourse)); Ne(Property(Identifier(c), Identifier(credits)), Constant(3)), Property(Identifier(c), Identifier(code))))
+
     >>> QueryParser("set [ c in ICourse | c.code ]")(None)
     Head(Query(<type 'set'>, In(Identifier(c), Identifier(ICourse)), Property(Identifier(c), Identifier(code))))
 
@@ -81,6 +87,9 @@
     >>> QueryParser("set [ c in ICourse; c.code==2  or c.code==3 | c ]")(None)
     Head(Query(<type 'set'>, In(Identifier(c), Identifier(ICourse)); Or(Eq(Property(Identifier(c), Identifier(code)), Constant(2)), Eq(Property(Identifier(c), Identifier(code)), Constant(3))), Identifier(c)))
 
+    >>> QueryParser("set [ c in ICourse; c.code==2  and c.code==3 | c ]")(None)
+    Head(Query(<type 'set'>, In(Identifier(c), Identifier(ICourse)); And(Eq(Property(Identifier(c), Identifier(code)), Constant(2)), Eq(Property(Identifier(c), Identifier(code)), Constant(3))), Identifier(c)))
+
     >>> QueryParser("set [ c in ICourse; not (c.code==2  or c.code==3) | c ]")(None)
     Head(Query(<type 'set'>, In(Identifier(c), Identifier(ICourse)); Not(Or(Eq(Property(Identifier(c), Identifier(code)), Constant(2)), Eq(Property(Identifier(c), Identifier(code)), Constant(3)))), Identifier(c)))
 
@@ -91,3 +100,6 @@
     Head(Query(<type 'set'>, In(Identifier(s), Identifier(IStudents));
     Alias(Identifier(a), Property(Identifier(s), Property(Identifier(major), Property(Identifier(address), Identifier(street)))));
     Or(Eq(Identifier(a), Constant('Hillhead Street')), Eq(Identifier(a), Constant('Gibson Street'))), Identifier(s)))
+
+    >>> QueryParser("set [ i in IPerson; isinstance(i, Tutor) | i ]")(None)
+    Head(Query(<type 'set'>, In(Identifier(i), Identifier(IPerson)); Isinstace(Identifier(i), Tutor), Identifier(i)))

Modified: Sandbox/adamg/ocql/trunk/src/ocql/parser/queryparser.py
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/parser/queryparser.py	2008-08-22 17:02:39 UTC (rev 90133)
+++ Sandbox/adamg/ocql/trunk/src/ocql/parser/queryparser.py	2008-08-22 18:55:58 UTC (rev 90134)
@@ -302,9 +302,9 @@
 
 #TODO add a test
     def p_expr_for_query(self, t):
-        r'''expression : collection SBRACKET_L qualifier FOR expression SBRACKET_R
+        r'''expression : collection SBRACKET_L expression FOR qualifier  SBRACKET_R
         '''
-        t[0] = Query(self.metadata, self.symbols, t[1], t[3], t[5])
+        t[0] = Query(self.metadata, self.symbols, t[1], t[5], t[3])
         if DEBUG: print 'reducing "collection SBRACKET_L qualifier FOR expression SBRACKET_R" to "expression"', t[0]
 
     def p_expr_literal(self, t):
@@ -484,7 +484,7 @@
     def p_condition_isinstance(self, t):
         r'''condition : ISINSTANCE BRACKET_L expression COMMA IDENTIFIER BRACKET_R
         '''
-        raise NotImplementedError('isinstance')
+        t[0] = Isinstace(self.metadata, self.symbols, t[3], t[5])
         if DEBUG: print 'reducing "ISINSTANCE BRACKET_L expression COMMA IDENTIFIER BRACKET_R" to "condition"', t[0]
 
     def p_quantified_expression(self, t):

Modified: Sandbox/adamg/ocql/trunk/src/ocql/queryobject/interfaces.py
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/queryobject/interfaces.py	2008-08-22 17:02:39 UTC (rev 90133)
+++ Sandbox/adamg/ocql/trunk/src/ocql/queryobject/interfaces.py	2008-08-22 18:55:58 UTC (rev 90134)
@@ -22,6 +22,13 @@
     Expression Query object
     """
 
+class IIsinstance(IExpression):
+    """Objects providing this interface represent the
+    isinstance Query object
+    """
+    objekt = Attribute('object')
+    tipe = Attribute('type')
+
 class IhasClassWith(IExpression):
     """Objects providing this interface represent the
     hasClassWith Query object

Modified: Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.py
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.py	2008-08-22 17:02:39 UTC (rev 90133)
+++ Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.py	2008-08-22 18:55:58 UTC (rev 90134)
@@ -105,6 +105,24 @@
 #
 # General
 #
+class Isinstace(Expression):
+    implements(IIsinstance)
+
+    def __init__(self, metadata, symbols, objekt, tipe):
+        self.metadata = metadata
+        self.symbols = symbols
+        Child.__init__(self)
+        self.setProp('objekt', objekt)
+        self.setProp('tipe', tipe)
+
+    def __repr__(self):
+        return "%s(%s, %s)" % (
+            self.__class__.__name__,
+            str(self.objekt),
+            str(self.tipe)
+            )
+
+
 class hasClassWith(Expression):
     #NotImplementedError
     implements(IhasClassWith)
@@ -274,15 +292,17 @@
         return t
 
     def get_collection_type(self):
-        t = self.left.get_class()
-        try:
-            r = t[self.right.name]
-        except:
-            from pub.dbgpclient import brk; brk()
-
+        if isinstance(self.right, Identifier):
+            t = self.left.get_class()
+            try:
+                r = t[self.right.name]
+            except:
+                from pub.dbgpclient import brk; brk()
         #print self.left.name+'.'+self.right.name,r
+            return r
 
-        return r
+        else:
+            return self.right.get_collection_type()
 
 class Index(Binary):
     #NotImplementedError

Modified: Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.txt
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.txt	2008-08-22 17:02:39 UTC (rev 90133)
+++ Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.txt	2008-08-22 18:55:58 UTC (rev 90134)
@@ -42,6 +42,11 @@
     >>> verifyObject(IExpression, Expression(metadata, symbols, child, child))
     True
 
+    >>> verifyClass(IIsinstance, Isinstance)
+    True
+    >>> verifyObject(IIsinstance, Isinstance(metadata, symbols, child, Child))
+    True
+
     >>> verifyClass(IhasClassWith, hasClassWith)
     True
     >>> verifyObject(IhasClassWith, hasClassWith(metadata, symbols, child, set, child))

Modified: Sandbox/adamg/ocql/trunk/src/ocql/rewriter/rewriter.py
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/rewriter/rewriter.py	2008-08-22 17:02:39 UTC (rev 90133)
+++ Sandbox/adamg/ocql/trunk/src/ocql/rewriter/rewriter.py	2008-08-22 18:55:58 UTC (rev 90134)
@@ -157,7 +157,7 @@
 
     def __call__(self):
         return Identifier(
-            '.'.join([self.context.left.name, self.context.right.name]))
+            '.'.join([IRewriter(self.context.left)().name, IRewriter(self.context.right)().name]))
 
 class AddRewriter(BinaryRewriter):
     implements(IRewriter)

Modified: Sandbox/adamg/ocql/trunk/src/ocql/rewriter/rewriter.txt
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/rewriter/rewriter.txt	2008-08-22 17:02:39 UTC (rev 90133)
+++ Sandbox/adamg/ocql/trunk/src/ocql/rewriter/rewriter.txt	2008-08-22 18:55:58 UTC (rev 90134)
@@ -117,7 +117,13 @@
     >>> print str(alg)
     Head(Iter(<type 'set'>, Lambda c: If(Not(<type 'set'>, c.code == `2` or c.code == `3`), Single(<type 'set'>, c), Empty(<type 'set'>)), Make(<type 'set'>, <type 'set'>, ICourse)))
 
-#    >>> qo = QueryParser("set [ s in IStudents; a as s.major.address.street; a=='Hillhead Street' or a=='Gibson Street' | s ]")(TestMetadata())
+    >>> qo = QueryParser("set [ s in IStudents; s.major.address.street == 'Hillhead Street' | s ]")(TestMetadata())
+    >>> opt = QueryOptimizer(qo)()
+    >>> alg = Rewriter(opt)()
+    >>> print str(alg)
+    Head(Iter(<type 'set'>, Lambda s: If(s.major.address.street == `'Hillhead Street'`, Single(<type 'set'>, s), Empty(<type 'set'>)), Make(<type 'set'>, <type 'set'>, IStudents)))
+
+#    >>> qo = QueryParser("set [ s in IStudents; a as s.major.address.street; a=='Hillhead Street' | s ]")(TestMetadata())
 #    >>> opt = QueryOptimizer(qo)()
 #    >>> alg = Rewriter(opt)()
 #    >>> print str(alg)

Modified: Sandbox/adamg/ocql/trunk/src/ocql/testing/database.py
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/testing/database.py	2008-08-22 17:02:39 UTC (rev 90133)
+++ Sandbox/adamg/ocql/trunk/src/ocql/testing/database.py	2008-08-22 18:55:58 UTC (rev 90134)
@@ -211,6 +211,7 @@
             'IAddress': [A1, A2],
             'IDepartments': [D1, D2],
             'ICourse': [C1, C2, C3],
+            'IPerson': [S1, S2, St1, St2, T1, V1],
             'IStaff': [S1, S2],
             'IStudents': [St1, St2],
             'ITutors': [T1],
@@ -220,6 +221,7 @@
             'IAddress': MClass(IAddress),
             'IDepartments': MClass(IDepartments),
             'ICourse': MClass(ICourse),
+            'IPerson': MClass(IPerson),
             'IStaff': MClass(IStaff),
             'IStudents': MClass(IStudents),
             'ITutors': MClass(ITutors),



More information about the Checkins mailing list