package preflightqueryprocessor

import "go.skia.org/infra/go/paramtools"

// In subquery, we collect params matching the query and cache it afterwards.
// The shared paramset object, however, is populated only by values for the key
// that's related to the subquery.
// Also, we don't count the number of subquery matching traces.
// For each tile, we collect values in a map, and populate the paramset for this key
// only after all tiles are processed.
// Checking a map is faster than iterating over a ParamSet trying to
// assess whether a value is present, so this should save us quite some time.
func (p *preflightSubQueryProcessor) ProcessTraceIds(out <-chan paramtools.Params) []paramtools.Params {
	key := p.key
	traceIdsForTile := []paramtools.Params{}

	// First, collects values for this tile. Afterwards, populate the shared map in one go.
	// This reduces the number of mutex lock/unlocks, which should save some time.
	valsForTile := []string{}
	for outParam := range out {
		traceIdsForTile = append(traceIdsForTile, outParam)
		if val, ok := outParam[key]; ok {
			valsForTile = append(valsForTile, val)
		}
	}

	// All values are collected, populate the shared map under one mutex lock.
	p.sharedMux.Lock()
	defer p.sharedMux.Unlock()
	for _, v := range valsForTile {
		p.filteredValuesFromTiles[v] = true
	}

	return traceIdsForTile
}

// After querying all tiles for a subquery, we should populate the paramset
// with values for the key related to the subquery.
func (p *preflightSubQueryProcessor) Finalize() {
	key := p.key
	for v := range p.filteredValuesFromTiles {
		p.AddParams(paramtools.Params{key: v})
	}
}
