| 32 | } |
| 33 | |
| 34 | func TestOptimize_count_threshold_gte(t *testing.T) { |
| 35 | tree, err := parser.Parse(`count(items, .active) >= 50`) |
| 36 | require.NoError(t, err) |
| 37 | |
| 38 | err = optimizer.Optimize(&tree.Node, nil) |
| 39 | require.NoError(t, err) |
| 40 | |
| 41 | // Operator should remain >=, but count should have threshold set |
| 42 | binary, ok := tree.Node.(*BinaryNode) |
| 43 | require.True(t, ok, "expected BinaryNode, got %T", tree.Node) |
| 44 | assert.Equal(t, ">=", binary.Operator) |
| 45 | |
| 46 | count, ok := binary.Left.(*BuiltinNode) |
| 47 | require.True(t, ok, "expected BuiltinNode, got %T", binary.Left) |
| 48 | assert.Equal(t, "count", count.Name) |
| 49 | require.NotNil(t, count.Threshold) |
| 50 | assert.Equal(t, 50, *count.Threshold) // threshold = N for >= operator |
| 51 | } |
| 52 | |
| 53 | func TestOptimize_count_threshold_lt(t *testing.T) { |
| 54 | tree, err := parser.Parse(`count(items, .active) < 100`) |