You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							133 lines
						
					
					
						
							4.8 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							133 lines
						
					
					
						
							4.8 KiB
						
					
					
				| package engine | |
| 
 | |
| import ( | |
| 	"testing" | |
| 
 | |
| 	"github.com/seaweedfs/seaweedfs/weed/pb/schema_pb" | |
| 	"github.com/stretchr/testify/assert" | |
| ) | |
| 
 | |
| // TestExecutionPlanFastPathDisplay tests that the execution plan correctly shows | |
| // "Parquet Statistics (fast path)" when fast path is used, not "Parquet Files (full scan)" | |
| func TestExecutionPlanFastPathDisplay(t *testing.T) { | |
| 	engine := NewMockSQLEngine() | |
| 
 | |
| 	// Create realistic data sources for fast path scenario | |
| 	dataSources := &TopicDataSources{ | |
| 		ParquetFiles: map[string][]*ParquetFileStats{ | |
| 			"/topics/test/topic/partition-1": { | |
| 				{ | |
| 					RowCount: 500, | |
| 					ColumnStats: map[string]*ParquetColumnStats{ | |
| 						"id": { | |
| 							ColumnName: "id", | |
| 							MinValue:   &schema_pb.Value{Kind: &schema_pb.Value_Int64Value{Int64Value: 1}}, | |
| 							MaxValue:   &schema_pb.Value{Kind: &schema_pb.Value_Int64Value{Int64Value: 500}}, | |
| 							NullCount:  0, | |
| 							RowCount:   500, | |
| 						}, | |
| 					}, | |
| 				}, | |
| 			}, | |
| 		}, | |
| 		ParquetRowCount: 500, | |
| 		LiveLogRowCount: 0, // Pure parquet scenario - ideal for fast path | |
| 		PartitionsCount: 1, | |
| 	} | |
| 
 | |
| 	t.Run("Fast path execution plan shows correct data sources", func(t *testing.T) { | |
| 		optimizer := NewFastPathOptimizer(engine.SQLEngine) | |
| 
 | |
| 		aggregations := []AggregationSpec{ | |
| 			{Function: FuncCOUNT, Column: "*", Alias: "COUNT(*)"}, | |
| 		} | |
| 
 | |
| 		// Test the strategy determination | |
| 		strategy := optimizer.DetermineStrategy(aggregations) | |
| 		assert.True(t, strategy.CanUseFastPath, "Strategy should allow fast path for COUNT(*)") | |
| 		assert.Equal(t, "all_aggregations_supported", strategy.Reason) | |
| 
 | |
| 		// Test data source list building | |
| 		builder := &ExecutionPlanBuilder{} | |
| 		dataSources := &TopicDataSources{ | |
| 			ParquetFiles: map[string][]*ParquetFileStats{ | |
| 				"/topics/test/topic/partition-1": { | |
| 					{RowCount: 500}, | |
| 				}, | |
| 			}, | |
| 			ParquetRowCount: 500, | |
| 			LiveLogRowCount: 0, | |
| 			PartitionsCount: 1, | |
| 		} | |
| 
 | |
| 		dataSourcesList := builder.buildDataSourcesList(strategy, dataSources) | |
| 
 | |
| 		// When fast path is used, should show "parquet_stats" not "parquet_files" | |
| 		assert.Contains(t, dataSourcesList, "parquet_stats", | |
| 			"Data sources should contain 'parquet_stats' when fast path is used") | |
| 		assert.NotContains(t, dataSourcesList, "parquet_files", | |
| 			"Data sources should NOT contain 'parquet_files' when fast path is used") | |
| 
 | |
| 		// Test that the formatting works correctly | |
| 		formattedSource := engine.SQLEngine.formatDataSource("parquet_stats") | |
| 		assert.Equal(t, "Parquet Statistics (fast path)", formattedSource, | |
| 			"parquet_stats should format to 'Parquet Statistics (fast path)'") | |
| 
 | |
| 		formattedFullScan := engine.SQLEngine.formatDataSource("parquet_files") | |
| 		assert.Equal(t, "Parquet Files (full scan)", formattedFullScan, | |
| 			"parquet_files should format to 'Parquet Files (full scan)'") | |
| 	}) | |
| 
 | |
| 	t.Run("Slow path execution plan shows full scan data sources", func(t *testing.T) { | |
| 		builder := &ExecutionPlanBuilder{} | |
| 
 | |
| 		// Create strategy that cannot use fast path | |
| 		strategy := AggregationStrategy{ | |
| 			CanUseFastPath: false, | |
| 			Reason:         "unsupported_aggregation_functions", | |
| 		} | |
| 
 | |
| 		dataSourcesList := builder.buildDataSourcesList(strategy, dataSources) | |
| 
 | |
| 		// When slow path is used, should show "parquet_files" and "live_logs" | |
| 		assert.Contains(t, dataSourcesList, "parquet_files", | |
| 			"Slow path should contain 'parquet_files'") | |
| 		assert.Contains(t, dataSourcesList, "live_logs", | |
| 			"Slow path should contain 'live_logs'") | |
| 		assert.NotContains(t, dataSourcesList, "parquet_stats", | |
| 			"Slow path should NOT contain 'parquet_stats'") | |
| 	}) | |
| 
 | |
| 	t.Run("Data source formatting works correctly", func(t *testing.T) { | |
| 		// Test just the data source formatting which is the key fix | |
|  | |
| 		// Test parquet_stats formatting (fast path) | |
| 		fastPathFormatted := engine.SQLEngine.formatDataSource("parquet_stats") | |
| 		assert.Equal(t, "Parquet Statistics (fast path)", fastPathFormatted, | |
| 			"parquet_stats should format to show fast path usage") | |
| 
 | |
| 		// Test parquet_files formatting (slow path) | |
| 		slowPathFormatted := engine.SQLEngine.formatDataSource("parquet_files") | |
| 		assert.Equal(t, "Parquet Files (full scan)", slowPathFormatted, | |
| 			"parquet_files should format to show full scan") | |
| 
 | |
| 		// Test that data sources list is built correctly for fast path | |
| 		builder := &ExecutionPlanBuilder{} | |
| 		fastStrategy := AggregationStrategy{CanUseFastPath: true} | |
| 
 | |
| 		fastSources := builder.buildDataSourcesList(fastStrategy, dataSources) | |
| 		assert.Contains(t, fastSources, "parquet_stats", | |
| 			"Fast path should include parquet_stats") | |
| 		assert.NotContains(t, fastSources, "parquet_files", | |
| 			"Fast path should NOT include parquet_files") | |
| 
 | |
| 		// Test that data sources list is built correctly for slow path | |
| 		slowStrategy := AggregationStrategy{CanUseFastPath: false} | |
| 
 | |
| 		slowSources := builder.buildDataSourcesList(slowStrategy, dataSources) | |
| 		assert.Contains(t, slowSources, "parquet_files", | |
| 			"Slow path should include parquet_files") | |
| 		assert.NotContains(t, slowSources, "parquet_stats", | |
| 			"Slow path should NOT include parquet_stats") | |
| 	}) | |
| }
 |