b58eb3649a5294875a58de2715f8a6623afab989 angie Wed Jul 31 13:41:11 2013 -0700 Special case for tables that are incrementally updated (currentlyjust GenBank tables): we need to sort them. diff --git src/hg/lib/annoStreamDb.c src/hg/lib/annoStreamDb.c index d3bcf24..f753993 100644 --- src/hg/lib/annoStreamDb.c +++ src/hg/lib/annoStreamDb.c @@ -571,30 +571,41 @@ sqlSafef(query, sizeof(query), "show index from %s", table); struct sqlResult *sr = sqlGetResult(conn, query); char **row; while ((row = sqlNextRow(sr)) != NULL) { if (sameString(row[4], field)) { indexName = cloneString(row[2]); break; } } sqlFreeResult(&sr); return indexName; } +static boolean isIncrementallyUpdated(char *table) +// Tables that have rows added to them after initial creation are not completely sorted +// because of new rows at end, so we have to 'order by'. +{ +return (sameString(table, "refGene") || sameString(table, "refFlat") || + sameString(table, "xenoRefGene") || sameString(table, "xenoRefFlat") || + sameString(table, "all_mrna") || sameString(table, "xenoMrna") || + sameString(table, "all_est") || sameString(table, "xenoEst") || + sameString(table, "refSeqAli") || sameString(table, "xenoRefSeqAli")); +} + struct annoStreamer *annoStreamDbNew(char *db, char *table, struct annoAssembly *aa, struct asObject *asObj, int maxOutRows) /* Create an annoStreamer (subclass) object from a database table described by asObj. */ { struct sqlConnection *conn = hAllocConn(db); if (!sqlTableExists(conn, table)) errAbort("annoStreamDbNew: table '%s' doesn't exist in database '%s'", table, db); struct annoStreamDb *self = NULL; AllocVar(self); struct annoStreamer *streamer = &(self->streamer); int dbtLen = strlen(db) + strlen(table) + 2; char dbTable[dbtLen]; safef(dbTable, dbtLen, "%s.%s", db, table); annoStreamerInit(streamer, aa, asObj, dbTable); streamer->rowType = arWords; @@ -606,30 +617,34 @@ char *asFirstColumnName = streamer->asObj->columnList->name; if (sqlFieldIndex(self->conn, self->table, "bin") == 0) { self->hasBin = 1; self->minFinestBin = binFromRange(0, 1); } if (self->hasBin && !sameString(asFirstColumnName, "bin")) self->omitBin = 1; if (!asdInitBed3Fields(self)) errAbort("annoStreamDbNew: can't figure out which fields of %s.%s to use as " "{chrom, chromStart, chromEnd}.", db, table); // When a table has an index on endField, sometimes the query optimizer uses it // and that ruins the sorting. Fortunately most tables don't anymore. self->endFieldIndexName = sqlTableIndexOnField(self->conn, self->table, self->endField); self->notSorted = FALSE; +// Special case: genbank-updated tables are not sorted because new mappings are +// tacked on at the end. +if (isIncrementallyUpdated(table)) + self->notSorted = TRUE; self->mergeBins = FALSE; self->maxOutRows = maxOutRows; self->useMaxOutRows = (maxOutRows > 0); self->needQuery = TRUE; self->chromList = annoAssemblySeqNames(aa); if (slCount(self->chromList) > 1000) { // Assembly has many sequences (e.g. scaffold-based assembly) -- // don't break up into per-sequence queries. Take our chances // with mysql being unhappy about the sqlResult being open too long. self->doQuery = asdDoQuerySimple; self->nextRowRaw = nextRowFromSqlResult; } else {