e926c846782645e96fa3ff0669bbcc1587aebd70 angie Fri Jun 1 11:16:57 2012 -0700 Refactoring for #6152: instead of having each formatter do its owncollection of rows, annoGratorQueryExecute should collect the rows and pass them to each formatter. diff --git src/lib/annoGratorQuery.c src/lib/annoGratorQuery.c index 1c48a6f..10aa08a 100644 --- src/lib/annoGratorQuery.c +++ src/lib/annoGratorQuery.c @@ -91,53 +91,47 @@ //#*** formatters should be told too, in case the info should go in the header, or if //#*** they should clip output to search region.... } void annoGratorQueryExecute(struct annoGratorQuery *query) /* For each annoRow from query->primarySource, invoke integrators and pass their annoRows * to formatters. */ { struct annoStreamer *primarySrc = query->primarySource; struct annoFormatter *formatter = NULL; struct annoRow *primaryRow = NULL; while ((primaryRow = primarySrc->nextRow(primarySrc)) != NULL) { if (primaryRow->rightJoinFail) continue; - for (formatter = query->formatters; formatter != NULL; formatter = formatter->next) - formatter->collect(formatter, primarySrc, primaryRow); - struct slRef *gratorRowLists = NULL; + struct slRef *gratorRowList = NULL; boolean rjFilterFailed = FALSE; struct annoStreamer *grator = (struct annoStreamer *)(query->integrators); for (; grator != NULL; grator = grator->next) { struct annoGrator *realGrator = (struct annoGrator *)grator; struct annoRow *gratorRows = realGrator->integrate(realGrator, primaryRow, &rjFilterFailed); - slAddHead(&gratorRowLists, slRefNew(gratorRows)); + slAddHead(&gratorRowList, slRefNew(gratorRows)); if (rjFilterFailed) break; - for (formatter = query->formatters; formatter != NULL; formatter = formatter->next) - formatter->collect(formatter, grator, gratorRows); } - slReverse(&gratorRowLists); + slReverse(&gratorRowList); for (formatter = query->formatters; formatter != NULL; formatter = formatter->next) - if (rjFilterFailed) - formatter->discard(formatter); - else - formatter->formatOne(formatter); + if (!rjFilterFailed) + formatter->formatOne(formatter, primaryRow, gratorRowList); annoRowFree(&primaryRow, primarySrc); - struct slRef *oneRowList = gratorRowLists; + struct slRef *oneRowList = gratorRowList; grator = (struct annoStreamer *)(query->integrators); for (; oneRowList != NULL; oneRowList = oneRowList->next, grator = grator->next) annoRowFreeList((struct annoRow **)&(oneRowList->val), grator); slFreeList(&oneRowList); } } void annoGratorQueryFree(struct annoGratorQuery **pQuery) /* Close and free all inputs and outputs; free self. */ { if (pQuery == NULL) return; struct annoGratorQuery *query = *pQuery; freez(&(query->assemblyName)); if (query->csAllocdHere)