createResourceIterator iterates through all resourcespans-level (batch-level) columns, groups them into rows representing one batch each. It builds on top of the span iterator, and turns the groups of spans and resource-level values into spansets. Spansets are returned that match any of the given co
(makeIter, makeNilIter makeIterFn, spanIterator parquetquery.Iterator, conditions []traceql.Condition, requireAtLeastOneMatchOverall, allConditions bool, dedicatedColumns backend.DedicatedColumns, selectAll bool)
| 1800 | // one batch each. It builds on top of the span iterator, and turns the groups of spans and resource-level values into |
| 1801 | // spansets. Spansets are returned that match any of the given conditions. |
| 1802 | func createResourceIterator(makeIter, makeNilIter makeIterFn, spanIterator parquetquery.Iterator, conditions []traceql.Condition, requireAtLeastOneMatchOverall, allConditions bool, dedicatedColumns backend.DedicatedColumns, selectAll bool) (parquetquery.Iterator, error) { |
| 1803 | var ( |
| 1804 | columnSelectAs = map[string]string{} |
| 1805 | columnPredicates = map[string][]parquetquery.Predicate{} |
| 1806 | iters = []parquetquery.Iterator{} |
| 1807 | genericConditions []traceql.Condition |
| 1808 | columnMapping = dedicatedColumnsToColumnMapping(dedicatedColumns, backend.DedicatedColumnScopeResource) |
| 1809 | ) |
| 1810 | |
| 1811 | addPredicate := func(columnPath string, p parquetquery.Predicate) { |
| 1812 | columnPredicates[columnPath] = append(columnPredicates[columnPath], p) |
| 1813 | } |
| 1814 | |
| 1815 | specialCase := func(cond traceql.Condition, columnPath string) (handled bool) { |
| 1816 | // Operands that need special handling. |
| 1817 | switch cond.Op { |
| 1818 | case traceql.OpNone: |
| 1819 | addPredicate(columnPath, nil) // No filtering |
| 1820 | columnSelectAs[columnPath] = cond.Attribute.Name |
| 1821 | return true |
| 1822 | case traceql.OpExists: |
| 1823 | addPredicate(columnPath, &parquetquery.SkipNilsPredicate{}) |
| 1824 | columnSelectAs[columnPath] = cond.Attribute.Name |
| 1825 | return true |
| 1826 | case traceql.OpNotExists: |
| 1827 | iters = append(iters, makeIter(columnPath, parquetquery.NewNilValuePredicate(), cond.Attribute.Name)) |
| 1828 | return true |
| 1829 | default: |
| 1830 | return false |
| 1831 | } |
| 1832 | } |
| 1833 | |
| 1834 | for _, cond := range conditions { |
| 1835 | isNotExistSearch := len(cond.Operands) == 0 && cond.Op == traceql.OpNotExists |
| 1836 | |
| 1837 | // Well-known selector? |
| 1838 | if entry, ok := wellKnownColumnLookups[cond.Attribute.Name]; ok && entry.level != traceql.AttributeScopeSpan { |
| 1839 | if specialCase(cond, entry.columnPath) { |
| 1840 | continue |
| 1841 | } |
| 1842 | |
| 1843 | // Compatible type? |
| 1844 | if isMatchingColumnType(entry.typ, operandType(cond.Operands)) { |
| 1845 | pred, err := createPredicate(cond.Op, cond.Operands) |
| 1846 | if err != nil { |
| 1847 | return nil, fmt.Errorf("creating predicate: %w", err) |
| 1848 | } |
| 1849 | iters = append(iters, makeIter(entry.columnPath, pred, cond.Attribute.Name)) |
| 1850 | continue |
| 1851 | } |
| 1852 | } |
| 1853 | |
| 1854 | // Attributes stored in dedicated columns |
| 1855 | if c, ok := columnMapping.get(cond.Attribute.Name); ok { |
| 1856 | if specialCase(cond, c.ColumnPath) { |
| 1857 | continue |
| 1858 | } |
| 1859 |
no test coverage detected