Skip to content

Commit 1e24105

Browse files
committed
optimize test code
1 parent 64ccb54 commit 1e24105

File tree

18 files changed

+1346
-407
lines changed

18 files changed

+1346
-407
lines changed

sqlrec-core/src/main/java/com/sqlrec/utils/SqlTestCase.java

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.sqlrec.common.runtime.ExecuteContext;
55
import com.sqlrec.compiler.CompileManager;
66
import com.sqlrec.runtime.BindableInterface;
7+
import com.sqlrec.runtime.CalciteBindable;
78
import com.sqlrec.runtime.ExecuteContextImpl;
89
import org.apache.calcite.jdbc.CalciteSchema;
910
import org.apache.calcite.linq4j.Enumerable;
@@ -20,6 +21,10 @@ public class SqlTestCase {
2021
public String sql;
2122
public List<Object[]> expectedResult;
2223
public Exception expectedException;
24+
public String expectedLogicalPlan;
25+
public String expectedPhysicalPlan;
26+
public String expectedJavaExpression;
27+
public boolean debugOutput = true;
2328

2429
public SqlTestCase(String sql) {
2530
this.sql = sql;
@@ -36,14 +41,28 @@ public SqlTestCase(String sql, List<Object[]> expectedResult, Exception expected
3641
this.expectedException = expectedException;
3742
}
3843

44+
public SqlTestCase(String sql, List<Object[]> expectedResult,
45+
String expectedLogicalPlan, String expectedPhysicalPlan, String expectedJavaExpression) {
46+
this.sql = sql;
47+
this.expectedResult = expectedResult;
48+
this.expectedLogicalPlan = expectedLogicalPlan;
49+
this.expectedPhysicalPlan = expectedPhysicalPlan;
50+
this.expectedJavaExpression = expectedJavaExpression;
51+
}
52+
53+
public SqlTestCase setDebugOutput(boolean debugOutput) {
54+
this.debugOutput = debugOutput;
55+
return this;
56+
}
57+
3958
public void checkResult(List<Object[]> actualResult) {
4059
if (expectedResult == null) {
4160
return;
4261
}
4362

4463
assert actualResult != null : "actualResult is null";
45-
assert actualResult.size() == expectedResult.size() :
46-
"size mismatch: expected " + expectedResult.size() + ", actual " + actualResult.size();
64+
assert actualResult.size() == expectedResult.size() :
65+
"size mismatch: expected " + expectedResult.size() + ", actual " + actualResult.size();
4766
for (int i = 0; i < actualResult.size(); i++) {
4867
Object[] actualRow = actualResult.get(i);
4968
Object[] expectedRow = expectedResult.get(i);
@@ -56,6 +75,43 @@ public void checkResult(List<Object[]> actualResult) {
5675
}
5776
}
5877

78+
public void checkBindable(CalciteBindable bindable) {
79+
if (expectedLogicalPlan != null) {
80+
String actualLogicalPlan = bindable.getLogicalPlan();
81+
if (!normalizeString(expectedLogicalPlan).equals(normalizeString(actualLogicalPlan))) {
82+
log.error("Logical plan mismatch:");
83+
log.error(" Expected (length={}):\n{}", expectedLogicalPlan.length(), expectedLogicalPlan);
84+
log.error(" Actual (length={}):\n{}", actualLogicalPlan.length(), actualLogicalPlan);
85+
assert false : "Logical plan mismatch";
86+
}
87+
}
88+
if (expectedPhysicalPlan != null) {
89+
String actualPhysicalPlan = bindable.getPhysicalPlan();
90+
if (!normalizeString(expectedPhysicalPlan).equals(normalizeString(actualPhysicalPlan))) {
91+
log.error("Physical plan mismatch:");
92+
log.error(" Expected (length={}):\n{}", expectedPhysicalPlan.length(), expectedPhysicalPlan);
93+
log.error(" Actual (length={}):\n{}", actualPhysicalPlan.length(), actualPhysicalPlan);
94+
assert false : "Physical plan mismatch";
95+
}
96+
}
97+
if (expectedJavaExpression != null) {
98+
String actualJavaExpression = bindable.getJavaExpression();
99+
if (!normalizeString(expectedJavaExpression).equals(normalizeString(actualJavaExpression))) {
100+
log.error("Java expression mismatch:");
101+
log.error(" Expected (length={}):\n{}", expectedJavaExpression.length(), expectedJavaExpression);
102+
log.error(" Actual (length={}):\n{}", actualJavaExpression.length(), actualJavaExpression);
103+
assert false : "Java expression mismatch";
104+
}
105+
}
106+
}
107+
108+
private String normalizeString(String str) {
109+
if (str == null) {
110+
return null;
111+
}
112+
return str.replaceAll("\\s+", "");
113+
}
114+
59115
public void test(CalciteSchema schema) throws Exception {
60116
test(schema, new ExecuteContextImpl());
61117
}
@@ -66,6 +122,19 @@ public void test(CalciteSchema schema, ExecuteContext executeContext) throws Exc
66122
BindableInterface bindable = new CompileManager().compileSql(flinkSqlNode, schema,
67123
Consts.DEFAULT_SCHEMA_NAME);
68124

125+
if (bindable instanceof CalciteBindable) {
126+
CalciteBindable calciteBindable = (CalciteBindable) bindable;
127+
if (debugOutput) {
128+
log.info("=== Logical Plan ===");
129+
log.info(calciteBindable.getLogicalPlan());
130+
log.info("=== Physical Plan ===");
131+
log.info(calciteBindable.getPhysicalPlan());
132+
log.info("=== Java Expression ===");
133+
log.info(calciteBindable.getJavaExpression());
134+
}
135+
checkBindable(calciteBindable);
136+
}
137+
69138
Exception actualException = null;
70139
Enumerable enumerable = null;
71140
try {
@@ -78,6 +147,9 @@ public void test(CalciteSchema schema, ExecuteContext executeContext) throws Exc
78147
assert actualException != null;
79148
assert expectedException.getClass().isAssignableFrom(actualException.getClass());
80149
} else {
150+
if (actualException != null) {
151+
log.error("Exception during execution:", actualException);
152+
}
81153
assert actualException == null;
82154
}
83155

sqlrec-core/src/main/java/com/sqlrec/utils/VectorJoinUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ private static Enumerable doVectorJoin(
118118
return Linq4j.asEnumerable(result);
119119
}
120120

121-
private static Object[] buildProjectRow(Object[] joinRow, List<Integer> projectColumns, int projectSize) {
121+
public static Object[] buildProjectRow(Object[] joinRow, List<Integer> projectColumns, int projectSize) {
122122
if (projectColumns == null || projectColumns.isEmpty()) {
123123
return joinRow;
124124
}

sqlrec-core/src/test/java/com/sqlrec/TestNormalSql.java

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.checkerframework.checker.nullness.qual.Nullable;
1717
import org.junit.jupiter.api.Test;
1818

19+
import java.util.ArrayList;
1920
import java.util.Arrays;
2021
import java.util.Collections;
2122
import java.util.List;
@@ -51,7 +52,7 @@ protected Map<String, Table> getTableMap() {
5152
new SqlTestCase(
5253
"cache table t0 as select 1 as a",
5354
Arrays.<Object[]>asList(
54-
new Object[]{"t0", 1L} // cache语句返回表名和行数
55+
new Object[]{"t0", 1L}
5556
)
5657
),
5758
new SqlTestCase(
@@ -63,7 +64,7 @@ protected Map<String, Table> getTableMap() {
6364
new SqlTestCase(
6465
"cache table t1 as SELECT * FROM myTable",
6566
Arrays.<Object[]>asList(
66-
new Object[]{"t1", 3L} // cache语句返回表名和行数
67+
new Object[]{"t1", 3L}
6768
)
6869
),
6970
new SqlTestCase(
@@ -77,7 +78,7 @@ protected Map<String, Table> getTableMap() {
7778
new SqlTestCase(
7879
"cache table t2 as SELECT NAME, count(*) as cnt FROM myTable where ID > 1 group by NAME",
7980
Arrays.<Object[]>asList(
80-
new Object[]{"t2", 2L} // cache语句返回表名和行数
81+
new Object[]{"t2", 2L}
8182
)
8283
),
8384
new SqlTestCase(
@@ -94,6 +95,44 @@ protected Map<String, Table> getTableMap() {
9495
}
9596
}
9697

98+
@Test
99+
public void testPlanValidationWithExpectedStrings() throws Exception {
100+
CalciteSchema schema = CalciteSchema.createRootSchema(false);
101+
schema.add(Consts.DEFAULT_SCHEMA_NAME, new AbstractSchema() {
102+
@Override
103+
protected Map<String, Table> getTableMap() {
104+
return Collections.singletonMap("myTable", new MyTable());
105+
}
106+
});
107+
108+
String expectedLogicalPlan = """
109+
LogicalProject(ID=[$0], NAME=[$1])
110+
LogicalTableScan(table=[[default, myTable]])""";
111+
String expectedPhysicalPlan = """
112+
EnumerableTableScan(table=[[default, myTable]])""";
113+
String expectedJavaExpression = """
114+
public org.apache.calcite.linq4j.Enumerable bind(final org.apache.calcite.DataContext root) {
115+
return org.apache.calcite.schema.Schemas.enumerable((org.apache.calcite.schema.ScannableTable) root.getRootSchema().getSubSchema("default").getTable("myTable"), root);
116+
}
117+
public Class getElementType() {
118+
return java.lang.Object[].class;
119+
}""";
120+
121+
List<Object[]> expectedResults = new ArrayList<>();
122+
expectedResults.add(new Object[]{1, "Alice"});
123+
expectedResults.add(new Object[]{2, "Bob"});
124+
expectedResults.add(new Object[]{3, "Charlie"});
125+
126+
SqlTestCase planValidationCase = new SqlTestCase(
127+
"select * from myTable",
128+
expectedResults,
129+
expectedLogicalPlan,
130+
expectedPhysicalPlan,
131+
expectedJavaExpression
132+
);
133+
planValidationCase.test(schema);
134+
}
135+
97136
public static class MyTable extends SqlRecTable implements ScannableTable {
98137

99138
@Override
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package com.sqlrec.compiler;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import static org.junit.jupiter.api.Assertions.*;
6+
7+
public class SqlPreProcesserTest {
8+
9+
@Test
10+
public void testPreProcessSqlWithNull() {
11+
String result = SqlPreProcesser.preProcessSql(null);
12+
assertNull(result);
13+
}
14+
15+
@Test
16+
public void testPreProcessSqlWithEmpty() {
17+
String result = SqlPreProcesser.preProcessSql("");
18+
assertEquals("", result);
19+
}
20+
21+
@Test
22+
public void testPreProcessSqlWithUseDefault() {
23+
String result = SqlPreProcesser.preProcessSql("use default");
24+
assertEquals("use `default`", result);
25+
}
26+
27+
@Test
28+
public void testPreProcessSqlWithUseDefaultWithSpaces() {
29+
String result = SqlPreProcesser.preProcessSql("use default ");
30+
assertEquals("use `default`", result);
31+
}
32+
33+
@Test
34+
public void testPreProcessSqlWithUseDefaultUpperCase() {
35+
String result = SqlPreProcesser.preProcessSql("USE DEFAULT");
36+
assertEquals("USE DEFAULT", result);
37+
}
38+
39+
@Test
40+
public void testPreProcessSqlWithShowTablesFromDefault() {
41+
String result = SqlPreProcesser.preProcessSql("show tables from default");
42+
assertEquals("show tables from `default`", result);
43+
}
44+
45+
@Test
46+
public void testPreProcessSqlWithShowTablesInDefault() {
47+
String result = SqlPreProcesser.preProcessSql("show tables in default");
48+
assertEquals("show tables in `default`", result);
49+
}
50+
51+
@Test
52+
public void testIsSetStatementWithSetKeyword() {
53+
assertTrue(SqlPreProcesser.isSetStatement("set param=value"));
54+
assertTrue(SqlPreProcesser.isSetStatement("SET param=value"));
55+
assertTrue(SqlPreProcesser.isSetStatement(" set param=value"));
56+
}
57+
58+
@Test
59+
public void testIsSetStatementWithNonSetKeyword() {
60+
assertFalse(SqlPreProcesser.isSetStatement("select * from t"));
61+
assertFalse(SqlPreProcesser.isSetStatement("insert into t values(1)"));
62+
assertFalse(SqlPreProcesser.isSetStatement("reset"));
63+
}
64+
65+
@Test
66+
public void testTransformSetStatementBasic() {
67+
String result = SqlPreProcesser.transformSetStatement("set param=test");
68+
assertEquals("set 'param'='test'", result);
69+
}
70+
71+
@Test
72+
public void testTransformSetStatementWithSpaces() {
73+
String result = SqlPreProcesser.transformSetStatement("set param = test");
74+
assertEquals("set 'param'='test'", result);
75+
}
76+
77+
@Test
78+
public void testTransformSetStatementWithTrim() {
79+
String result = SqlPreProcesser.transformSetStatement(" set param=test ");
80+
assertEquals("set 'param'='test'", result);
81+
}
82+
83+
@Test
84+
public void testTransformSetStatementWithAlreadyQuoted() {
85+
String result = SqlPreProcesser.transformSetStatement("set 'param'='test'");
86+
assertEquals("set 'param'='test'", result);
87+
}
88+
89+
@Test
90+
public void testTransformSetStatementWithMultipleEquals() {
91+
String result = SqlPreProcesser.transformSetStatement("set param=test=value");
92+
assertEquals("set param=test=value", result);
93+
}
94+
95+
@Test
96+
public void testTransformSetStatementWithNoEquals() {
97+
String result = SqlPreProcesser.transformSetStatement("set param");
98+
assertEquals("set param", result);
99+
}
100+
101+
@Test
102+
public void testPreProcessSqlWithSetStatement() {
103+
String result = SqlPreProcesser.preProcessSql("set param=test");
104+
assertEquals("set 'param'='test'", result);
105+
}
106+
107+
@Test
108+
public void testPreProcessSqlWithNormalSql() {
109+
String sql = "select * from my_table";
110+
String result = SqlPreProcesser.preProcessSql(sql);
111+
assertEquals(sql, result);
112+
}
113+
114+
@Test
115+
public void testPreProcessSqlWithMixedCaseUseDefault() {
116+
String result = SqlPreProcesser.preProcessSql("Use Default");
117+
assertEquals("Use Default", result);
118+
}
119+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.sqlrec.model;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.util.Arrays;
6+
import java.util.Collections;
7+
import java.util.List;
8+
9+
import static org.junit.jupiter.api.Assertions.*;
10+
11+
public class ModelEntityConverterAdditionalTest {
12+
13+
@Test
14+
public void testFixPathProtocolWithAlreadyPrefixedPath() {
15+
List<String> paths = Arrays.asList(
16+
"hdfs://localhost:9000/path/to/table",
17+
"s3://bucket/path/to/table"
18+
);
19+
20+
List<String> result = ModelEntityConverter.fixPathProtocol(paths);
21+
22+
assertNotNull(result);
23+
assertEquals(2, result.size());
24+
assertEquals("hdfs://localhost:9000/path/to/table", result.get(0));
25+
assertEquals("s3://bucket/path/to/table", result.get(1));
26+
}
27+
28+
@Test
29+
public void testFixPathProtocolWithEmptyList() {
30+
List<String> result = ModelEntityConverter.fixPathProtocol(Collections.emptyList());
31+
32+
assertNotNull(result);
33+
assertTrue(result.isEmpty());
34+
}
35+
36+
@Test
37+
public void testFixPathProtocolWithMixedPaths() {
38+
List<String> paths = Arrays.asList(
39+
"hdfs://localhost:9000/path/to/table",
40+
"/path/to/local/table"
41+
);
42+
43+
List<String> result = ModelEntityConverter.fixPathProtocol(paths);
44+
45+
assertNotNull(result);
46+
assertEquals(2, result.size());
47+
assertEquals("hdfs://localhost:9000/path/to/table", result.get(0));
48+
assertTrue(result.get(1).contains("/path/to/local/table"));
49+
}
50+
}

0 commit comments

Comments
 (0)