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])
}
}