src/lib/rqlParse.c 1.7

1.7 2009/12/05 03:51:27 kent
Adding whereVarList to rqlStatement structure.
Index: src/lib/rqlParse.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/lib/rqlParse.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -b -B -U 4 -r1.6 -r1.7
--- src/lib/rqlParse.c	3 Dec 2009 20:05:24 -0000	1.6
+++ src/lib/rqlParse.c	5 Dec 2009 03:51:27 -0000	1.7
@@ -1,5 +1,6 @@
-/* rqlParse - parse restricted sql-like query language.  Produce rqlParse tree.  */
+/* rqlParse - parse restricted sql-like query language.  Produce rqlParse tree.  See rqlEval.c
+ * for the rqlParse interpreter. */
 
 #include "common.h"
 #include "linefile.h"
 #include "hash.h"
@@ -278,9 +279,12 @@
     }
 }
 
 static struct rqlParse *rqlParseIndex(struct tokenizer *tkz)
-/* Handle the [] in this[6] */
+/* Handle the [] in this[6].  Convert it into tree:
+*         rqlOpArrayIx
+*            rqlParseAtom
+*            rqlParseAtom */
 {
 struct rqlParse *collection = rqlParseAtom(tkz);
 struct rqlParse *p = collection;
 char *tok = tokenizerNext(tkz);
@@ -562,8 +566,19 @@
     errAbort("Expecting field name line %d of %s", tkz->lf->lineIx, tkz->lf->fileName);
 return buf->string;
 }
 
+
+void rqlParseVarsUsed(struct rqlParse *p, struct slName **pVarList)
+/* Put variables used by self and children onto varList. */
+{
+if (p->op == rqlOpSymbol)
+    slNameStore(pVarList, p->val.s);
+struct rqlParse *child;
+for (child = p->children; child != NULL; child = child->next)
+    rqlParseVarsUsed(child, pVarList);
+}
+
 struct rqlStatement *rqlStatementParse(struct lineFile *lf)
 /* Parse an RQL statement out of text */
 {
 struct tokenizer *tkz = tokenizerOnLineFile(lf);
@@ -660,8 +675,9 @@
 	}
     else
         {
 	rql->whereClause = rqlParseExpression(tkz);
+	rqlParseVarsUsed(rql->whereClause, &rql->whereVarList);
 	}
     }
 
 /* Parse limit clause. */
@@ -739,7 +755,9 @@
     slFreeList(&rql->fieldList);
     slFreeList(&rql->tableList);
     if (rql->whereClause !=NULL)
 	rqlParseFreeRecursive(rql->whereClause);
+    slFreeList(&rql->whereVarList);
     freez(pRql);
     }
 }
+