4f813a33f070da3ed7317861d6bae4d831af8fc0
tdreszer
  Tue Feb 22 13:27:13 2011 -0800
Added mdbObjsEncodeExperimentify() which will organize objects into experiments and allow the expId to be updated into the mdb
diff --git src/hg/inc/mdb.h src/hg/inc/mdb.h
index 20d90c9..9ffdc12 100644
--- src/hg/inc/mdb.h
+++ src/hg/inc/mdb.h
@@ -285,57 +285,83 @@
 void mdbObjsSortOnVars(struct mdbObj **mdbObjs, char *vars);
 // Sorts on var,val pairs vars lists: fwd case-sensitive.  Assumes all objs' vars are in identical order.
 // Optionally give list of vars "cell antibody treatment" to sort on (bringing to front of vars lists).
 
 void mdbObjsSortOnVarPairs(struct mdbObj **mdbObjs,struct slPair *varValPairs);
 // Sorts on var,val pairs vars lists: fwd case-sensitive.  Assumes all objs' vars are in identical order.
 // This method will use mdbObjsSortOnVars()
 
 void mdbObjRemoveVars(struct mdbObj *mdbObjs, char *vars);
 // Prunes list of vars for an object, freeing the memory.  Doesn't touch DB.
 
 char *mdbRemoveCommonVar(struct mdbObj *mdbList, char *var);
 // Removes var from set of mdbObjs but only if all that hav it have a commmon val
 // Returns the val if removed, else NULL
 
+boolean mdbObjSetVar(struct mdbObj *mdbObj, char *var,char *val);
+// Sets the string value to a single var in an obj, preparing for DB update.
+// returns TRUE if updated, FALSE if added
+
+boolean mdbObjSetVarInt(struct mdbObj *mdbObj, char *var,int val);
+// Sets an integer value to a single var in an obj, preparing for DB update.
+// returns TRUE if updated, FALSE if added
+
 void mdbObjSwapVars(struct mdbObj *mdbObjs, char *vars,boolean deleteThis);
 // Replaces objs' vars with var=vap pairs provided, preparing for DB update.
 
-struct mdbObj *mdbObjsFilter(struct mdbObj **pMdbObjs, char *var, char *val,boolean exclude);
-// Filters mdb objects to only those that include/exclude vars.  Optionally checks val too.  Frees removed objects
+struct mdbObj *mdbObjsFilter(struct mdbObj **pMdbObjs, char *var, char *val,boolean returnMatches);
+// Filters mdb objects to only those that include/exclude vars.  Optionally checks val too.
+// Returns matched or unmatched items objects as requested, maintaining sort order
+
+struct mdbObj *mdbObjsFilterByVars(struct mdbObj **pMdbObjs,char *vars,boolean noneEqualsNotFound,boolean returnMatches);
+// Filters mdb objects to only those that include/exclude var=val pairs (e.g. "var1=val1 var2 var3!=val3 var4=None").
+// Supports != ("var!=" means var not found). Optionally supports var=None equal to var is not found
+// Returns matched or unmatched items objects as requested.  Multiple passes means sort order is destroyed.
 
 struct mdbObj *mdbObjsFilterTablesOrFiles(struct mdbObj **pMdbObjs,boolean table, boolean files);
 // Filters mdb objects to only those that have associated tables or files. Returns removed non-table/file objects
 // Note: Since table/file objects overlap, there are 3 possibilites: tables, files, table && files
 
 struct mdbObj *mdbObjIntersection(struct mdbObj **a, struct mdbObj *b);
 // return duplicate objs from an intersection of two mdbObj lists.
 // List b is untouched but pA will contain the resulting intersection
 
 void mdbObjTransformToUpdate(struct mdbObj *mdbObjs, char *var, char *varType,char *val,boolean deleteThis);
 // Turns one or more mdbObjs into the stucture needed to add/update or delete.
 
 struct mdbObj *mdbObjClone(const struct mdbObj *mdbObj);
 // Clones a single mdbObj, including hash and maintining order
 
 struct slName *mdbObjToSlName(struct mdbObj *mdbObjs);
 // Creates slNames list of mdbObjs->obj.  mdbObjs remains untouched
 
 int mdbVarCmp(const void *va, const void *vb);
 /* Compare to sort on label. */
 
 
+// ----------------- Validateion and specialty APIs -----------------
+int mdbObjsValidate(struct mdbObj *mdbObjs, boolean full);
+// Validates vars and vals against cv.ra.  Returns count of errors found.
+// Full considers vars not defined in cv as invalids
+
+struct mdbObj *mdbObjsEncodeExperimentify(struct sqlConnection *conn,char *db,char *tableName,struct mdbObj **pMdbObjs,int warn);
+// Organizes objects into experiments and validates experiment IDs.  Will add/update the ids in the structures.
+// If warn=1, then prints to stdout all the experiments/obs with missing or wrong expIds;
+//    warn=2, then print line for each obj with expId or warning.
+// Returns a new set of mdbObjs that is what can (and should) be used to update the mdb via mdbObjsSetToDb().
+
+
 // --------------- Free at last ----------------
 void mdbObjsFree(struct mdbObj **mdbObjsPtr);
 // Frees one or more metadata objects and any contained mdbVars.  Will free any hashes as well.
 
 void mdbByVarsFree(struct mdbByVar **mdbByVarsPtr);
 // Frees one or more metadata vars and any contained vals and objs.  Will free any hashes as well.
 
 
 // ----------------- CGI specific routines for use with tdb -----------------
 const struct mdbObj *metadataForTable(char *db,struct trackDb *tdb,char *table);
 // Returns the metadata for a table.  NEVER FREE THIS STRUCT!
 // This is the main routine for CGIs to access metadata
 
 const char *metadataFindValue(struct trackDb *tdb, char *var);
 // Finds the val associated with the var or retruns NULL
@@ -377,22 +403,17 @@
 // metadata Variavble are only certain declared types
     {
     cvsNotSearchable        =0,  // Txt is default
     cvsSearchByMultiSelect  =1,  // Search by drop down multi-select of supplied list (NOT YET IMPLEMENTED)
     cvsSearchBySingleSelect =2,  // Search by drop down single-select of supplied list
     cvsSearchByFreeText     =3,  // Search by free text field (NOT YET IMPLEMENTED)
     cvsSearchByDateRange    =4,  // Search by discovered date range (NOT YET IMPLEMENTED)
     cvsSearchByIntegerRange =5   // Search by discovered integer range (NOT YET IMPLEMENTED)
     };
 
 enum mdbCvSearchable mdbCvSearchMethod(char *term);
 // returns whether the term is searchable // TODO: replace with mdbCvWhiteList() returning struct
 
 const char *cvLabel(char *term);
 // returns cv label if term found or else just term
-
-int mdbObjsValidate(struct mdbObj *mdbObjs, boolean full);
-// Validates vars and vals against cv.ra.  Returns count of errors found.
-// Full considers vars not defined in cv as invalids
-
 #endif /* MDB_H */