Skip to content

Commit 78051d6

Browse files
committed
Unit test functions under validate folder
Signed-off-by: Yuanchun Shen <yuanchu@amazon.com>
1 parent 0d299b5 commit 78051d6

5 files changed

Lines changed: 789 additions & 0 deletions

File tree

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package org.opensearch.sql.calcite.validate;
7+
8+
import static org.junit.jupiter.api.Assertions.assertEquals;
9+
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
10+
import static org.junit.jupiter.api.Assertions.assertNotNull;
11+
import static org.junit.jupiter.api.Assertions.assertTrue;
12+
import static org.opensearch.sql.calcite.utils.OpenSearchTypeFactory.TYPE_FACTORY;
13+
14+
import java.util.List;
15+
import org.apache.calcite.rel.type.RelDataType;
16+
import org.apache.calcite.sql.SqlBasicCall;
17+
import org.apache.calcite.sql.SqlDataTypeSpec;
18+
import org.apache.calcite.sql.SqlIdentifier;
19+
import org.apache.calcite.sql.SqlNode;
20+
import org.apache.calcite.sql.SqlWriter;
21+
import org.apache.calcite.sql.SqlWriterConfig;
22+
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
23+
import org.apache.calcite.sql.parser.SqlParserPos;
24+
import org.apache.calcite.sql.pretty.SqlPrettyWriter;
25+
import org.apache.calcite.sql.validate.SqlConformance;
26+
import org.junit.jupiter.api.Test;
27+
import org.opensearch.sql.calcite.utils.OpenSearchTypeFactory.ExprUDT;
28+
29+
public class OpenSearchSparkSqlDialectTest {
30+
@Test
31+
public void testGetCastSpecForIpType() {
32+
RelDataType ipType = TYPE_FACTORY.createUDT(ExprUDT.EXPR_IP);
33+
34+
SqlNode castSpec = OpenSearchSparkSqlDialect.DEFAULT.getCastSpec(ipType);
35+
36+
assertNotNull(castSpec);
37+
assertInstanceOf(SqlDataTypeSpec.class, castSpec);
38+
SqlDataTypeSpec typeSpec = (SqlDataTypeSpec) castSpec;
39+
assertEquals("OTHER", typeSpec.getTypeName().toString());
40+
assertEquals("IP", typeSpec.toString());
41+
}
42+
43+
private SqlWriter createWriter(StringBuilder sb) {
44+
SqlWriterConfig config =
45+
SqlPrettyWriter.config().withDialect(OpenSearchSparkSqlDialect.DEFAULT);
46+
return new SqlPrettyWriter(config, sb);
47+
}
48+
49+
@Test
50+
public void testUnparseCallArgMin() {
51+
StringBuilder sb = new StringBuilder();
52+
SqlWriter writer = createWriter(sb);
53+
54+
SqlIdentifier col1 = new SqlIdentifier("value_col", SqlParserPos.ZERO);
55+
SqlIdentifier col2 = new SqlIdentifier("key_col", SqlParserPos.ZERO);
56+
57+
// Create a call that mimics ARG_MIN
58+
SqlBasicCall argMinCall =
59+
new SqlBasicCall(SqlStdOperatorTable.ARG_MIN, List.of(col1, col2), SqlParserPos.ZERO);
60+
61+
OpenSearchSparkSqlDialect.DEFAULT.unparseCall(writer, argMinCall, 0, 0);
62+
String result = sb.toString();
63+
64+
// Should be translated to MIN_BY
65+
assertTrue(result.contains("MIN_BY"));
66+
}
67+
68+
@Test
69+
public void testUnparseCallArgMax() {
70+
StringBuilder sb = new StringBuilder();
71+
SqlWriter writer = createWriter(sb);
72+
73+
SqlIdentifier col1 = new SqlIdentifier("value_col", SqlParserPos.ZERO);
74+
SqlIdentifier col2 = new SqlIdentifier("key_col", SqlParserPos.ZERO);
75+
76+
SqlBasicCall argMaxCall =
77+
new SqlBasicCall(SqlStdOperatorTable.ARG_MAX, List.of(col1, col2), SqlParserPos.ZERO);
78+
79+
OpenSearchSparkSqlDialect.DEFAULT.unparseCall(writer, argMaxCall, 0, 0);
80+
String result = sb.toString();
81+
82+
// Should be translated to MAX_BY
83+
assertTrue(result.contains("MAX_BY"));
84+
}
85+
86+
@Test
87+
public void testUnparseCallRegularOperator() {
88+
StringBuilder sb = new StringBuilder();
89+
SqlWriter writer = createWriter(sb);
90+
91+
SqlIdentifier col1 = new SqlIdentifier("col1", SqlParserPos.ZERO);
92+
SqlIdentifier col2 = new SqlIdentifier("col2", SqlParserPos.ZERO);
93+
94+
SqlBasicCall plusCall =
95+
new SqlBasicCall(SqlStdOperatorTable.PLUS, List.of(col1, col2), SqlParserPos.ZERO);
96+
97+
OpenSearchSparkSqlDialect.DEFAULT.unparseCall(writer, plusCall, 0, 0);
98+
String result = sb.toString();
99+
100+
// Should contain the + operator, not translated
101+
assertTrue(result.contains("+"));
102+
}
103+
104+
@Test
105+
public void testGetConformanceIsLiberal() {
106+
SqlConformance conformance = OpenSearchSparkSqlDialect.DEFAULT.getConformance();
107+
108+
assertNotNull(conformance);
109+
assertTrue(conformance.isLiberal());
110+
}
111+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package org.opensearch.sql.calcite.validate;
7+
8+
import static org.junit.jupiter.api.Assertions.assertNotNull;
9+
import static org.junit.jupiter.api.Assertions.assertTrue;
10+
11+
import com.google.common.collect.ImmutableSet;
12+
import java.util.Map;
13+
import org.apache.calcite.sql.type.SqlTypeCoercionRule;
14+
import org.apache.calcite.sql.type.SqlTypeName;
15+
import org.junit.jupiter.api.Test;
16+
17+
public class PplTypeCoercionRuleTest {
18+
@Test
19+
public void testOtherToVarcharCoercion() {
20+
SqlTypeCoercionRule rule = PplTypeCoercionRule.instance();
21+
Map<SqlTypeName, ImmutableSet<SqlTypeName>> mapping = rule.getTypeMapping();
22+
23+
// OTHER should be coercible to VARCHAR (IP type support)
24+
ImmutableSet<SqlTypeName> varcharCoercions = mapping.get(SqlTypeName.VARCHAR);
25+
assertNotNull(varcharCoercions);
26+
assertTrue(varcharCoercions.contains(SqlTypeName.OTHER));
27+
}
28+
29+
@Test
30+
public void testOtherToCharCoercion() {
31+
SqlTypeCoercionRule rule = PplTypeCoercionRule.instance();
32+
Map<SqlTypeName, ImmutableSet<SqlTypeName>> mapping = rule.getTypeMapping();
33+
34+
// OTHER should be coercible to CHAR (IP type support)
35+
ImmutableSet<SqlTypeName> charCoercions = mapping.get(SqlTypeName.CHAR);
36+
assertNotNull(charCoercions);
37+
assertTrue(charCoercions.contains(SqlTypeName.OTHER));
38+
}
39+
40+
@Test
41+
public void testVarcharToOtherCoercion() {
42+
SqlTypeCoercionRule rule = PplTypeCoercionRule.instance();
43+
Map<SqlTypeName, ImmutableSet<SqlTypeName>> mapping = rule.getTypeMapping();
44+
45+
// VARCHAR should be coercible from OTHER
46+
ImmutableSet<SqlTypeName> otherCoercions = mapping.get(SqlTypeName.OTHER);
47+
assertNotNull(otherCoercions);
48+
assertTrue(otherCoercions.contains(SqlTypeName.VARCHAR));
49+
assertTrue(otherCoercions.contains(SqlTypeName.CHAR));
50+
}
51+
52+
@Test
53+
public void testNumericToVarcharCoercion() {
54+
SqlTypeCoercionRule rule = PplTypeCoercionRule.instance();
55+
Map<SqlTypeName, ImmutableSet<SqlTypeName>> mapping = rule.getTypeMapping();
56+
57+
// VARCHAR should be coercible from numeric types
58+
ImmutableSet<SqlTypeName> varcharCoercions = mapping.get(SqlTypeName.VARCHAR);
59+
assertNotNull(varcharCoercions);
60+
61+
// Check some numeric types are included
62+
assertTrue(varcharCoercions.contains(SqlTypeName.INTEGER));
63+
assertTrue(varcharCoercions.contains(SqlTypeName.BIGINT));
64+
assertTrue(varcharCoercions.contains(SqlTypeName.DOUBLE));
65+
assertTrue(varcharCoercions.contains(SqlTypeName.DECIMAL));
66+
}
67+
}

0 commit comments

Comments
 (0)