IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 29717 for trunk/ippTools


Ignore:
Timestamp:
Nov 9, 2010, 12:31:36 PM (16 years ago)
Author:
bills
Message:

rework warptool -towarped to first query for labels that have outstanding
warpRuns and loop over them in priority order. Much much faster when there are lots of warpSkyfiles to
process

Location:
trunk/ippTools
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/ippTools/share/Makefile.am

    r29671 r29717  
    385385        warptool_tooverlap.sql \
    386386        warptool_towarped.sql \
     387        warptool_towarped_labels.sql \
    387388        warptool_updateskyfile.sql \
    388389        warptool_warped.sql \
  • trunk/ippTools/src/warptool.c

    r29416 r29717  
    924924
    925925    psMetadata *where = psMetadataAlloc();
     926
    926927    PXOPT_COPY_S64(config->args, where, "-warp_id", "warpSkyCellMap.warp_id", "==");
    927     pxAddLabelSearchArgs (config, where, "-label", "warpRun.label", "==");
    928928
    929929    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
    930930    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
    931931
    932     // find all rawImfiles matching the default query
    933     psString query = pxDataGet("warptool_towarped.sql");
    934     if (!query) {
     932    // First find Label's with warpRuns in state new in priority order
     933    psMetadata *labelWhere = psMetadataAlloc();
     934    pxAddLabelSearchArgs (config, labelWhere, "-label", "warpRun.label", "==");
     935
     936    psString labelQuery = pxDataGet("warptool_towarped_labels.sql");
     937    if (!labelQuery) {
    935938        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
    936939        return false;
    937940    }
    938 
    939     psString whereStr = psStringCopy("");
     941    psString labelWhereStr = psStringCopy("");
     942    if (psListLength(labelWhere->list)) {
     943        psString whereClause = psDBGenerateWhereConditionSQL(labelWhere, NULL);
     944        psStringAppend(&labelWhereStr, "\n AND %s", whereClause);
     945        psFree(whereClause);
     946    }
     947    psFree(labelWhere);
     948
     949    if (!p_psDBRunQueryF(config->dbh, labelQuery, labelWhereStr)) {
     950        psError(PS_ERR_UNKNOWN, false, "database error");
     951        psFree(labelQuery);
     952        return false;
     953    }
     954    psFree(labelQuery);
     955    psFree(labelWhereStr);
     956
     957    psArray *labelOutput = p_psDBFetchResult(config->dbh);
     958    if (psArrayLength(labelOutput) == 0) {
     959        psTrace("warptool", PS_LOG_INFO, "no labels with pending warps found.");
     960        return true;
     961    }
     962
     963    psString originalQuery = pxDataGet("warptool_towarped.sql");
     964    if (!originalQuery) {
     965        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
     966        return false;
     967    }
     968
     969    psString whereStr = NULL;
    940970    if (psListLength(where->list)) {
    941971        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
     
    945975    psFree(where);
    946976
    947     // treat limit == 0 as "no limit"
    948     psString limitString = psStringCopy("\nORDER BY priority DESC, warp_id");
    949     if (limit) {
    950         // We apply the limit to both sides of the UNION to avoid slow queries
    951         // and to the query itself to satisfy the user's requested limit
    952         psStringAppend(&limitString, "%s", psDBGenerateLimitSQL(limit));
    953         psStringAppend(&query, " %s", limitString);
    954     }
    955 
    956     if (!p_psDBRunQueryF(config->dbh, query, whereStr, limitString, whereStr,  limitString)) {
    957         psError(PS_ERR_UNKNOWN, false, "database error");
     977    // Now loop over the labels and query each individually
     978    for (long i = 0; i < psArrayLength(labelOutput); i++) {
     979        psMetadata *labelRow = labelOutput->data[i];
     980
     981        bool status;
     982        psString label = psMetadataLookupStr(&status, labelRow, "label");
     983
     984        psString query = psStringCopy(originalQuery);
     985
     986        // treat limit == 0 as "no limit"
     987        psString limitString = psStringCopy("");
     988        if (limit) {
     989            // We apply the limit to both sides of the UNION to avoid slow queries
     990            // and to the query itself to satisfy the user's requested limit
     991            psStringAppend(&limitString, "\n%s", psDBGenerateLimitSQL(limit));
     992            psStringAppend(&query, "%s", limitString);
     993        }
     994        psString thisWhere = NULL;
     995        if (whereStr) {
     996            psStringAppend(&thisWhere, whereStr);
     997        }
     998        psStringAppend(&thisWhere, "\nAND warpRun.label = '%s'", label);
     999
     1000        if (!p_psDBRunQueryF(config->dbh, query, thisWhere, limitString, thisWhere,  limitString)) {
     1001            psError(PS_ERR_UNKNOWN, false, "database error");
     1002            psFree(query);
     1003            return false;
     1004        }
     1005        psFree(limitString);
     1006        psFree(thisWhere);
    9581007        psFree(query);
    959         return false;
    960     }
    961     psFree(limitString);
     1008
     1009        psArray *output = p_psDBFetchResult(config->dbh);
     1010        if (!output) {
     1011            psErrorCode err = psErrorCodeLast();
     1012            switch (err) {
     1013                case PS_ERR_DB_CLIENT:
     1014                    psError(PXTOOLS_ERR_SYS, false, "database error");
     1015                    case PS_ERR_DB_SERVER:
     1016                    psError(PXTOOLS_ERR_PROG, false, "database error");
     1017                default:
     1018                    psError(PXTOOLS_ERR_PROG, false, "unknown error");
     1019            }
     1020
     1021            return false;
     1022        }
     1023        long outputLength = psArrayLength(output);
     1024        if (outputLength) {
     1025            // negative simple so the default is true
     1026            if (!ippdbPrintMetadatas(stdout, output, "warpPendingSkyCell", !simple)) {
     1027                psError(PS_ERR_UNKNOWN, false, "failed to print array");
     1028                psFree(output);
     1029                return false;
     1030            }
     1031        } else {
     1032            psTrace("warptool", PS_LOG_INFO, "no rows found for %s", label);
     1033            psFree(output);
     1034            continue;
     1035        }
     1036        psFree(output);
     1037
     1038        if (limit) {
     1039            limit -= outputLength;
     1040            if (limit <= 0) {
     1041                // All done
     1042                break;
     1043            }
     1044        }
     1045    }
     1046    psFree(labelOutput);
    9621047    psFree(whereStr);
    963     psFree(query);
    964 
    965     psArray *output = p_psDBFetchResult(config->dbh);
    966     if (!output) {
    967         psErrorCode err = psErrorCodeLast();
    968         switch (err) {
    969             case PS_ERR_DB_CLIENT:
    970                 psError(PXTOOLS_ERR_SYS, false, "database error");
    971             case PS_ERR_DB_SERVER:
    972                 psError(PXTOOLS_ERR_PROG, false, "database error");
    973             default:
    974                 psError(PXTOOLS_ERR_PROG, false, "unknown error");
    975         }
    976 
    977         return false;
    978     }
    979     if (!psArrayLength(output)) {
    980         psTrace("warptool", PS_LOG_INFO, "no rows found");
    981         psFree(output);
    982         return true;
    983     }
    984 
    985     if (psArrayLength(output)) {
    986         // negative simple so the default is true
    987         if (!ippdbPrintMetadatas(stdout, output, "warpPendingSkyCell", !simple)) {
    988             psError(PS_ERR_UNKNOWN, false, "failed to print array");
    989             psFree(output);
    990             return false;
    991         }
    992     }
    993 
    994     psFree(output);
     1048    psFree(originalQuery);
    9951049
    9961050    return true;
Note: See TracChangeset for help on using the changeset viewer.