IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
May 11, 2009, 4:38:18 PM (17 years ago)
Author:
Paul Price
Message:

Make magictool -definebyquery work with inverse subtractions (A-B and B-A). Small change to DB schema.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/pap_magic/ippTools/src/magictool.c

    r23970 r24136  
    127127    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
    128128    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
    129 
    130     psMetadata *where = psMetadataAlloc();
    131     PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
    132     PXOPT_COPY_STR(config->args, where, "-diff_label", "diffRun.label", "==");
    133 
     129    PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
     130
     131    psMetadata *diffWhere = psMetadataAlloc(); // WHERE conditions for diffRuns
     132    PXOPT_COPY_STR(config->args, diffWhere, "-diff_label", "diffRun.label", "==");
     133
     134    psMetadata *queryWhere = psMetadataAlloc(); // WHERE conditions for everything else
     135    PXOPT_COPY_S64(config->args, queryWhere, "-exp_id", "exp_id", "==");
    134136
    135137    // Get list of exposures ready to magic
     
    146148        PXOPT_LOOKUP_BOOL(rerun, config->args, "-rerun", false);
    147149
    148         psString queryWhere = NULL;     // WHERE conditions for entire query
     150        psString diffWhereStr = NULL;   // WHERE conditions for diffRuns
     151        psString queryWhereStr = NULL;  // WHERE conditions for entire query
    149152        if (!available) {
    150             psStringAppend(&queryWhere, " \nWHERE diffRun.state = 'full'");
    151         } else {
    152             // what if no skycells for the diff run completed?
    153         }
     153            psStringAppend(&diffWhereStr, "\nAND diffRun.state = 'full'");
     154        }
     155        // what if no skycells for the diff run completed?
     156
    154157        if (!rerun) {
    155             const char *newWhere = " magic_id IS NULL"; // String to add
    156             if (queryWhere) {
    157                 psStringAppend(&queryWhere, " AND %s", newWhere);
    158             } else {
    159                 psStringAppend(&queryWhere, "\nWHERE %s", newWhere);
    160             }
    161         }
     158            psStringAppend(&queryWhereStr, "\n%s magic_id IS NULL", queryWhereStr ? "AND" : "WHERE");
     159        }
     160
    162161        // now add the user specified qualifiers
    163         if (psListLength(where->list)) {
    164             psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
    165             psStringAppend(&queryWhere, "\n%s %s", queryWhere == NULL ? "WHERE" : "AND", whereClause);
     162        if (psListLength(diffWhere->list)) {
     163            psString whereClause = psDBGenerateWhereConditionSQL(diffWhere, NULL);
     164            psStringAppend(&diffWhereStr, "\nAND %s", whereClause);
    166165            psFree(whereClause);
    167166        }
    168         psFree(where);
    169         if (!queryWhere) {
    170             psStringAppend(&queryWhere, " ");
    171         }
    172 
    173         if (!p_psDBRunQueryF(config->dbh, query, queryWhere)) {
     167        if (psListLength(queryWhere->list)) {
     168            psString whereClause = psDBGenerateWhereConditionSQL(queryWhere, NULL);
     169            psStringAppend(&queryWhereStr, "\n%s %s", queryWhereStr ? "AND" : "WHERE", whereClause);
     170            psFree(whereClause);
     171        }
     172        psFree(diffWhere);
     173        psFree(queryWhere);
     174
     175        // Ensure the WHERE strings have something
     176        if (!diffWhereStr) {
     177            diffWhereStr = psStringCopy("");
     178        }
     179        if (!queryWhereStr) {
     180            queryWhereStr = psStringCopy("");
     181        }
     182
     183        if (!p_psDBRunQueryF(config->dbh, query, diffWhereStr, diffWhereStr, queryWhereStr)) {
    174184            psError(PS_ERR_UNKNOWN, false, "database error");
    175             psFree(queryWhere);
     185            psFree(diffWhereStr);
     186            psFree(queryWhereStr);
    176187            psFree(query);
    177188            return false;
    178189        }
    179         psFree(queryWhere);
     190        psFree(diffWhereStr);
     191        psFree(queryWhereStr);
    180192        psFree(query);
    181193    }
     
    201213    }
    202214
     215
     216    if (pretend) {
     217        // negative simple so the default is true
     218        if (!ippdbPrintMetadatas(stdout, output, "diffRun", !simple)) {
     219            psError(PS_ERR_UNKNOWN, false, "failed to print array");
     220            psFree(output);
     221            return false;
     222        }
     223        psFree(output);
     224        return true;
     225    }
     226
     227
    203228    // Parse the list of exposures ready to magic
    204 
    205229    if (!psDBTransaction(config->dbh)) {
    206230        psError(PS_ERR_UNKNOWN, false, "database error");
     
    215239        psS64 exp_id = psMetadataLookupS64(NULL, row, "exp_id"); // Exposure identifier
    216240        psS64 diff_id = psMetadataLookupS64(NULL, row, "diff_id"); // difference identifier
     241        bool inverse = psMetadataLookupU64(NULL, row, "inverse"); // Inverse subtraction? Note types!
    217242
    218243        // create a new magicRun for this group
    219         magicRunRow *run = magicRunRowAlloc(0, exp_id, diff_id, "new", workdir, "dirty", label, dvodb, registered, 0);
     244        magicRunRow *run = magicRunRowAlloc(0, exp_id, diff_id, inverse, "new", workdir, "dirty", label,
     245                                            dvodb, registered, 0);
    220246        if (!run) {
    221247            psAbort("failed to alloc magicRun object");
     
    296322
    297323    // optional
     324    PXOPT_LOOKUP_BOOL(inverse, config->args, "-inverse", false);
    298325    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
    299326    PXOPT_LOOKUP_STR(dvodb, config->args, "-dvodb", false, false);
     
    305332            exp_id,
    306333            diff_id ? diff_id : PS_MAX_S64,
     334            inverse,
    307335            "reg",      // state
    308336            workdir,
Note: See TracChangeset for help on using the changeset viewer.