/** Returns whether NULL values are sorted first or last, in this dialect, * in an ORDER BY item of a given direction. */ public RelFieldCollation.NullDirection defaultNullDirection( RelFieldCollation.Direction direction) { switch (direction) { case ASCENDING: case STRICTLY_ASCENDING: return getNullCollation().last(false) ? RelFieldCollation.NullDirection.LAST : RelFieldCollation.NullDirection.FIRST; case DESCENDING: case STRICTLY_DESCENDING: return getNullCollation().last(true) ? RelFieldCollation.NullDirection.LAST : RelFieldCollation.NullDirection.FIRST; default: return RelFieldCollation.NullDirection.UNSPECIFIED; } }
protected SqlNode emulateNullDirectionWithIsNull(SqlNode node, boolean nullsFirst, boolean desc) { // No need for emulation if the nulls will anyways come out the way we want // them based on "nullsFirst" and "desc". if (nullCollation.isDefaultOrder(nullsFirst, desc)) { return null; } node = SqlStdOperatorTable.IS_NULL.createCall(SqlParserPos.ZERO, node); if (nullsFirst) { node = SqlStdOperatorTable.DESC.createCall(SqlParserPos.ZERO, node); } return node; }
/** Tests ORDER BY ... with various values of * {@link CalciteConnectionConfig#defaultNullCollation()}. */ @Test public void testOrderByVarious() { final boolean[] booleans = {false, true}; for (NullCollation nullCollation : NullCollation.values()) { for (boolean asc : booleans) { checkOrderBy(asc, nullCollation); } } }
/** Test case for * <a href="https://issues.apache.org/jira/browse/CALCITE-2323">[CALCITE-2323] * Validator should allow alternative nullCollations for ORDER BY in * OVER</a>. */ @Test public void testUserDefinedOrderByOver() { String sql = "select deptno,\n" + " rank() over(partition by empno order by deptno)\n" + "from emp\n" + "order by row_number() over(partition by empno order by deptno)"; Properties properties = new Properties(); properties.setProperty( CalciteConnectionProperty.DEFAULT_NULL_COLLATION.camelName(), NullCollation.LOW.name()); CalciteConnectionConfigImpl connectionConfig = new CalciteConnectionConfigImpl(properties); TesterImpl tester = new TesterImpl(getDiffRepos(), false, false, true, false, null, null, SqlToRelConverter.Config.DEFAULT, SqlConformanceEnum.DEFAULT, Contexts.of(connectionConfig)); sql(sql).with(tester).ok(); }
/** Test case for * <a href="https://issues.apache.org/jira/browse/CALCITE-2323">[CALCITE-2323] * Validator should allow alternative nullCollations for ORDER BY in * OVER</a>. */ @Test public void testUserDefinedOrderByOver() { String sql = "select deptno,\n" + " rank() over(partition by empno order by deptno)\n" + "from emp\n" + "order by row_number() over(partition by empno order by deptno)"; Properties properties = new Properties(); properties.setProperty( CalciteConnectionProperty.DEFAULT_NULL_COLLATION.camelName(), NullCollation.LOW.name()); CalciteConnectionConfigImpl connectionConfig = new CalciteConnectionConfigImpl(properties); TesterImpl tester = new TesterImpl(getDiffRepos(), false, false, true, false, null, null, SqlToRelConverter.Config.DEFAULT, SqlConformanceEnum.DEFAULT, Contexts.of(connectionConfig)); sql(sql).with(tester).ok(); }
/** Returns whether NULL values are sorted first or last, in this dialect, * in an ORDER BY item of a given direction. */ public RelFieldCollation.NullDirection defaultNullDirection( RelFieldCollation.Direction direction) { switch (direction) { case ASCENDING: case STRICTLY_ASCENDING: return getNullCollation().last(false) ? RelFieldCollation.NullDirection.LAST : RelFieldCollation.NullDirection.FIRST; case DESCENDING: case STRICTLY_DESCENDING: return getNullCollation().last(true) ? RelFieldCollation.NullDirection.LAST : RelFieldCollation.NullDirection.FIRST; default: return RelFieldCollation.NullDirection.UNSPECIFIED; } }
/** Tests ORDER BY ... with various values of * {@link CalciteConnectionConfig#defaultNullCollation()}. */ @Test public void testOrderByVarious() { final boolean[] booleans = {false, true}; for (NullCollation nullCollation : NullCollation.values()) { for (boolean asc : booleans) { checkOrderBy(asc, nullCollation); } } }
protected SqlNode emulateNullDirectionWithIsNull(SqlNode node, boolean nullsFirst, boolean desc) { // No need for emulation if the nulls will anyways come out the way we want // them based on "nullsFirst" and "desc". if (nullCollation.isDefaultOrder(nullsFirst, desc)) { return null; } node = SqlStdOperatorTable.IS_NULL.createCall(SqlParserPos.ZERO, node); if (nullsFirst) { node = SqlStdOperatorTable.DESC.createCall(SqlParserPos.ZERO, node); } return node; }
case UNSPECIFIED: final RelFieldCollation.NullDirection nullDefaultDirection = validator.getDefaultNullCollation().last(desc(direction)) ? RelFieldCollation.NullDirection.LAST : RelFieldCollation.NullDirection.FIRST; if (nullDefaultDirection != direction.defaultNullDirection()) { SqlKind nullDirectionSqlKind = validator.getDefaultNullCollation().last(desc(direction)) ? SqlKind.NULLS_LAST : SqlKind.NULLS_FIRST;
case UNSPECIFIED: final RelFieldCollation.NullDirection nullDefaultDirection = validator.getDefaultNullCollation().last(desc(direction)) ? RelFieldCollation.NullDirection.LAST : RelFieldCollation.NullDirection.FIRST; if (nullDefaultDirection != direction.defaultNullDirection()) { SqlKind nullDirectionSqlKind = validator.getDefaultNullCollation().last(desc(direction)) ? SqlKind.NULLS_LAST : SqlKind.NULLS_FIRST;
assertThat(msg, numbers.get(nullCollation.last(desc) ? 2 : 0), nullValue()); };
assertThat(msg, numbers.get(nullCollation.last(desc) ? 2 : 0), nullValue()); };
validator.getDefaultNullCollation().last(desc(direction)) ? RelFieldCollation.NullDirection.LAST : RelFieldCollation.NullDirection.FIRST;
validator.getDefaultNullCollation().last(desc(direction)) ? RelFieldCollation.NullDirection.LAST : RelFieldCollation.NullDirection.FIRST;
validator.getDefaultNullCollation().last(desc(direction)) ? RelFieldCollation.NullDirection.LAST : RelFieldCollation.NullDirection.FIRST;
nullDirection = validator.getDefaultNullCollation().last(desc(direction)) ? RelFieldCollation.NullDirection.LAST : RelFieldCollation.NullDirection.FIRST;
nullDirection = validator.getDefaultNullCollation().last(desc(direction)) ? RelFieldCollation.NullDirection.LAST : RelFieldCollation.NullDirection.FIRST;
nullDirection = validator.getDefaultNullCollation().last(desc(direction)) ? RelFieldCollation.NullDirection.LAST : RelFieldCollation.NullDirection.FIRST;
nullDirection = validator.getDefaultNullCollation().last(desc(direction)) ? RelFieldCollation.NullDirection.LAST : RelFieldCollation.NullDirection.FIRST;