src/hg/lib/mdb.c 1.7

1.7 2010/05/11 16:03:48 tdreszer
Improve multi-var query
Index: src/hg/lib/mdb.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/lib/mdb.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -b -B -U 4 -r1.6 -r1.7
--- src/hg/lib/mdb.c	11 May 2010 01:43:30 -0000	1.6
+++ src/hg/lib/mdb.c	11 May 2010 16:03:48 -0000	1.7
@@ -1152,9 +1152,9 @@
     if(!sqlTableExists(conn,table))
         return NULL;
 
     struct dyString *dy = newDyString(4096);
-    dyStringPrintf(dy, "select distinct obj,var,varType,val from %s", table);
+    dyStringPrintf(dy, "select obj,var,varType,val from %s", table);
 
     struct mdbByVar *rootVar;
     for(rootVar=mdbByVars;rootVar!=NULL;rootVar=rootVar->next)
         {
@@ -1234,22 +1234,23 @@
     if(!sqlTableExists(conn,table))
         return NULL;
 
     struct dyString *dy = newDyString(4096);
-    dyStringPrintf(dy, "select distinct obj,var,varType,val from %s", table);
+    dyStringPrintf(dy, "select t1.obj,t1.var,t1.varType,t1.val from %s t1", table);
 
     struct mdbByVar *rootVar;
     boolean gotVar = FALSE;
-    for(rootVar=mdbByVars;rootVar!=NULL;rootVar=rootVar->next)
+    int tix;
+    for(rootVar=mdbByVars,tix=2;rootVar!=NULL;rootVar=rootVar->next,tix++)
         {
         if(!gotVar)
             {
-            dyStringPrintf(dy, " where obj in ");
+            dyStringPrintf(dy, " where t1.obj in ");
             gotVar=TRUE;
             }
         else
-            dyStringPrintf(dy, " AND obj in ");
-        dyStringPrintf(dy, "(select obj from %s where var ",table);
+            dyStringPrintf(dy, " AND t1.obj in ");
+        dyStringPrintf(dy, "(select t%d.obj from %s t%d where t%d.obj = t1.obj and t%d.var ",tix,table,tix,tix,tix);
 
         if(rootVar->notEqual && rootVar->vals == NULL)
             dyStringPrintf(dy, "%s",strchr(rootVar->var,'%')?"NOT ":"!");
 
@@ -1264,9 +1265,9 @@
                 continue;
 
             if(!multiVals)
                 {
-                dyStringPrintf(dy, " and val ");
+                dyStringPrintf(dy, " and t%d.val ",tix);
                 if(rootVar->notEqual)
                     dyStringPrintf(dy, "%s",strchr(limbVal->val,'%')?"NOT ":"!");
                 if(limbVal->next == NULL) // only one val
                     {