func()

in query/aql_compiler.go [799:892]


func (qc *AQLQueryContext) processFilters() {
	// OOPK engine only supports one measure per query.
	if len(qc.Query.Measures) != 1 {
		qc.Error = utils.StackError(nil, "expect one measure per query, but got %d",
			len(qc.Query.Measures))
		return
	}

	// Categorize common filters and prefilters based on matched prefilters.
	commonFilters := qc.Query.Measures[0].FiltersParsed
	prefilters := qc.Prefilters
	for index, filter := range qc.Query.FiltersParsed {
		if len(prefilters) == 0 || prefilters[0] > index {
			// common filters
			commonFilters = append(commonFilters, filter)
		} else {
			qc.OOPK.Prefilters = append(qc.OOPK.Prefilters, filter)
			prefilters = prefilters[1:]
		}
	}

	var geoFilterFound bool
	for _, filter := range commonFilters {
		foreignTableColumnDetector := foreignTableColumnDetector{}
		expr.Walk(&foreignTableColumnDetector, filter)
		if foreignTableColumnDetector.hasForeignTableColumn {
			var isGeoFilter bool
			if qc.OOPK.geoIntersection != nil {
				geoTableID := qc.OOPK.geoIntersection.shapeTableID
				joinSchema := qc.TableSchemaByName[qc.Query.Joins[geoTableID-1].Table]
				isGeoFilter = qc.matchGeoFilter(filter, geoTableID, joinSchema, geoFilterFound)
				if qc.Error != nil {
					return
				}
			}

			if !isGeoFilter {
				qc.OOPK.ForeignTableCommonFilters = append(qc.OOPK.ForeignTableCommonFilters, filter)
			} else {
				geoFilterFound = true
			}
		} else {
			qc.OOPK.MainTableCommonFilters = append(qc.OOPK.MainTableCommonFilters, filter)
		}
	}

	if qc.OOPK.geoIntersection != nil && !geoFilterFound {
		qc.Error = utils.StackError(nil, "Exact one geo filter is needed if geo intersection"+
			" is used during join")
		return
	}

	// Process time filter.
	qc.processTimeFilter()
	if qc.Error != nil {
		return
	}

	// Collect column usages from the filters.
	for _, f := range qc.OOPK.MainTableCommonFilters {
		expr.Walk(columnUsageCollector{
			tableScanners: qc.TableScanners,
			usages:        columnUsedByAllBatches,
		}, f)
	}

	for _, f := range qc.OOPK.ForeignTableCommonFilters {
		expr.Walk(columnUsageCollector{
			tableScanners: qc.TableScanners,
			usages:        columnUsedByAllBatches,
		}, f)
	}

	for _, f := range qc.OOPK.Prefilters {
		expr.Walk(columnUsageCollector{
			tableScanners: qc.TableScanners,
			usages:        columnUsedByLiveBatches,
		}, f)
	}

	if qc.OOPK.TimeFilters[0] != nil {
		expr.Walk(columnUsageCollector{
			tableScanners: qc.TableScanners,
			usages:        columnUsedByFirstArchiveBatch | columnUsedByLiveBatches,
		}, qc.OOPK.TimeFilters[0])
	}

	if qc.OOPK.TimeFilters[1] != nil {
		expr.Walk(columnUsageCollector{
			tableScanners: qc.TableScanners,
			usages:        columnUsedByLastArchiveBatch | columnUsedByLiveBatches,
		}, qc.OOPK.TimeFilters[1])
	}
}