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)