@Test public void testDate() { List<RowExpression> values = new ArrayList<>(); values.add(constant(1L, DATE)); values.add(constant(2L, DATE)); values.add(constant(3L, DATE)); assertEquals(checkSwitchGenerationCase(DATE, values), DIRECT_SWITCH); for (long i = 4; i <= 32; ++i) { values.add(constant(i, DATE)); } assertEquals(checkSwitchGenerationCase(DATE, values), DIRECT_SWITCH); values.add(constant(33L, DATE)); assertEquals(checkSwitchGenerationCase(DATE, values), SET_CONTAINS); }
Class<?> javaType = type.getJavaType(); SwitchGenerationCase switchGenerationCase = checkSwitchGenerationCase(type, values); BytecodeNode testBytecode = generatorContext.generate(testValue, Optional.empty()); if (isDeterminateConstant(testValue, isIndeterminateFunction.getMethodHandle())) { ConstantExpression constant = (ConstantExpression) testValue; Object object = constant.getValue(); for (Map.Entry<Integer, Collection<BytecodeNode>> bucket : hashBuckets.asMap().entrySet()) { Collection<BytecodeNode> testValues = bucket.getValue(); BytecodeBlock caseBlock = buildInCase( generatorContext, scope, BytecodeBlock defaultCaseBlock = buildInCase( generatorContext, scope,
Class<?> javaType = type.getJavaType(); SwitchGenerationCase switchGenerationCase = checkSwitchGenerationCase(type, values); Collection<BytecodeNode> testValues = bucket.getValue(); BytecodeBlock caseBlock = buildInCase(generatorContext, scope, type, label, match, defaultLabel, testValues, false); switchCaseBlocks.append(caseBlock.setDescription("case " + bucket.getKey())); BytecodeBlock defaultCaseBlock = buildInCase(generatorContext, scope, type, defaultLabel, match, noMatch, defaultBucket.build(), true).setDescription("default");
generator = new InCodeGenerator(registry); break;
generator = new InCodeGenerator(registry); break;
@Test public void testDouble() { List<RowExpression> values = new ArrayList<>(); values.add(constant(1.5, DOUBLE)); values.add(constant(2.5, DOUBLE)); values.add(constant(3.5, DOUBLE)); assertEquals(checkSwitchGenerationCase(DOUBLE, values), HASH_SWITCH); values.add(constant(null, DOUBLE)); assertEquals(checkSwitchGenerationCase(DOUBLE, values), HASH_SWITCH); for (int i = 5; i <= 32; ++i) { values.add(constant(i + 0.5, DOUBLE)); } assertEquals(checkSwitchGenerationCase(DOUBLE, values), HASH_SWITCH); values.add(constant(33.5, DOUBLE)); assertEquals(checkSwitchGenerationCase(DOUBLE, values), SET_CONTAINS); }
@Test public void testVarchar() { List<RowExpression> values = new ArrayList<>(); values.add(constant(Slices.utf8Slice("1"), DOUBLE)); values.add(constant(Slices.utf8Slice("2"), DOUBLE)); values.add(constant(Slices.utf8Slice("3"), DOUBLE)); assertEquals(checkSwitchGenerationCase(VARCHAR, values), HASH_SWITCH); values.add(constant(null, VARCHAR)); assertEquals(checkSwitchGenerationCase(VARCHAR, values), HASH_SWITCH); for (int i = 5; i <= 32; ++i) { values.add(constant(Slices.utf8Slice(String.valueOf(i)), VARCHAR)); } assertEquals(checkSwitchGenerationCase(VARCHAR, values), HASH_SWITCH); values.add(constant(Slices.utf8Slice("33"), VARCHAR)); assertEquals(checkSwitchGenerationCase(VARCHAR, values), SET_CONTAINS); } }
@Test public void testBigint() { List<RowExpression> values = new ArrayList<>(); values.add(constant(Integer.MAX_VALUE + 1L, BIGINT)); values.add(constant(Integer.MIN_VALUE - 1L, BIGINT)); values.add(constant(3L, BIGINT)); assertEquals(checkSwitchGenerationCase(BIGINT, values), HASH_SWITCH); values.add(constant(null, BIGINT)); assertEquals(checkSwitchGenerationCase(BIGINT, values), HASH_SWITCH); values.add(new CallExpression( new Signature( CAST, SCALAR, BIGINT.getTypeSignature(), DOUBLE.getTypeSignature()), BIGINT, Collections.singletonList(constant(12345678901234.0, DOUBLE)))); assertEquals(checkSwitchGenerationCase(BIGINT, values), HASH_SWITCH); for (long i = 6; i <= 32; ++i) { values.add(constant(i, BIGINT)); } assertEquals(checkSwitchGenerationCase(BIGINT, values), HASH_SWITCH); values.add(constant(33L, BIGINT)); assertEquals(checkSwitchGenerationCase(BIGINT, values), SET_CONTAINS); }
@Test public void testInteger() { List<RowExpression> values = new ArrayList<>(); values.add(constant(Integer.MIN_VALUE, INTEGER)); values.add(constant(Integer.MAX_VALUE, INTEGER)); values.add(constant(3, INTEGER)); assertEquals(checkSwitchGenerationCase(INTEGER, values), DIRECT_SWITCH); values.add(constant(null, INTEGER)); assertEquals(checkSwitchGenerationCase(INTEGER, values), DIRECT_SWITCH); values.add(new CallExpression( new Signature( CAST, SCALAR, INTEGER.getTypeSignature(), DOUBLE.getTypeSignature()), INTEGER, Collections.singletonList(constant(12345678901234.0, DOUBLE)))); assertEquals(checkSwitchGenerationCase(INTEGER, values), DIRECT_SWITCH); for (int i = 6; i <= 32; ++i) { values.add(constant(i, INTEGER)); } assertEquals(checkSwitchGenerationCase(INTEGER, values), DIRECT_SWITCH); values.add(constant(33, INTEGER)); assertEquals(checkSwitchGenerationCase(INTEGER, values), SET_CONTAINS); }
@Test public void testDate() { List<RowExpression> values = new ArrayList<>(); values.add(new ConstantExpression(1L, DATE)); values.add(new ConstantExpression(2L, DATE)); values.add(new ConstantExpression(3L, DATE)); assertEquals(checkSwitchGenerationCase(DATE, values), DIRECT_SWITCH); for (long i = 4; i <= 32; ++i) { values.add(new ConstantExpression(i, DATE)); } assertEquals(checkSwitchGenerationCase(DATE, values), DIRECT_SWITCH); values.add(new ConstantExpression(33L, DATE)); assertEquals(checkSwitchGenerationCase(DATE, values), SET_CONTAINS); }
@Test public void testDouble() { List<RowExpression> values = new ArrayList<>(); values.add(new ConstantExpression(1.5, DOUBLE)); values.add(new ConstantExpression(2.5, DOUBLE)); values.add(new ConstantExpression(3.5, DOUBLE)); assertEquals(checkSwitchGenerationCase(DOUBLE, values), HASH_SWITCH); values.add(new ConstantExpression(null, DOUBLE)); assertEquals(checkSwitchGenerationCase(DOUBLE, values), HASH_SWITCH); for (int i = 5; i <= 32; ++i) { values.add(new ConstantExpression(i + 0.5, DOUBLE)); } assertEquals(checkSwitchGenerationCase(DOUBLE, values), HASH_SWITCH); values.add(new ConstantExpression(33.5, DOUBLE)); assertEquals(checkSwitchGenerationCase(DOUBLE, values), SET_CONTAINS); }
@Test public void testVarchar() { List<RowExpression> values = new ArrayList<>(); values.add(new ConstantExpression(Slices.utf8Slice("1"), DOUBLE)); values.add(new ConstantExpression(Slices.utf8Slice("2"), DOUBLE)); values.add(new ConstantExpression(Slices.utf8Slice("3"), DOUBLE)); assertEquals(checkSwitchGenerationCase(VARCHAR, values), HASH_SWITCH); values.add(new ConstantExpression(null, VARCHAR)); assertEquals(checkSwitchGenerationCase(VARCHAR, values), HASH_SWITCH); for (int i = 5; i <= 32; ++i) { values.add(new ConstantExpression(Slices.utf8Slice(String.valueOf(i)), VARCHAR)); } assertEquals(checkSwitchGenerationCase(VARCHAR, values), HASH_SWITCH); values.add(new ConstantExpression(Slices.utf8Slice("33"), VARCHAR)); assertEquals(checkSwitchGenerationCase(VARCHAR, values), SET_CONTAINS); } }
@Test public void testBigintLarge() { List<RowExpression> values = new ArrayList<>(); values.add(new ConstantExpression(Integer.MAX_VALUE + 1L, BIGINT)); values.add(new ConstantExpression(Integer.MIN_VALUE - 1L, BIGINT)); values.add(new ConstantExpression(3L, BIGINT)); assertEquals(checkSwitchGenerationCase(BIGINT, values), HASH_SWITCH); values.add(new ConstantExpression(null, BIGINT)); assertEquals(checkSwitchGenerationCase(BIGINT, values), HASH_SWITCH); values.add(new CallExpression( new Signature( CAST, SCALAR, BIGINT.getDisplayName(), DOUBLE.getDisplayName() ), BIGINT, Collections.singletonList(new ConstantExpression(12345678901234.0, DOUBLE)) )); assertEquals(checkSwitchGenerationCase(BIGINT, values), HASH_SWITCH); for (long i = 6; i <= 32; ++i) { values.add(new ConstantExpression(i, BIGINT)); } assertEquals(checkSwitchGenerationCase(BIGINT, values), HASH_SWITCH); values.add(new ConstantExpression(33L, BIGINT)); assertEquals(checkSwitchGenerationCase(BIGINT, values), SET_CONTAINS); }
@Test public void testBigintSmall() { List<RowExpression> values = new ArrayList<>(); values.add(new ConstantExpression((long) Integer.MIN_VALUE, BIGINT)); values.add(new ConstantExpression((long) Integer.MAX_VALUE, BIGINT)); values.add(new ConstantExpression(3L, BIGINT)); assertEquals(checkSwitchGenerationCase(BIGINT, values), DIRECT_SWITCH); values.add(new ConstantExpression(null, BIGINT)); assertEquals(checkSwitchGenerationCase(BIGINT, values), DIRECT_SWITCH); values.add(new CallExpression( new Signature( CAST, SCALAR, BIGINT.getDisplayName(), DOUBLE.getDisplayName() ), BIGINT, Collections.singletonList(new ConstantExpression(12345678901234.0, DOUBLE)) )); assertEquals(checkSwitchGenerationCase(BIGINT, values), DIRECT_SWITCH); for (long i = 6; i <= 32; ++i) { values.add(new ConstantExpression(i, BIGINT)); } assertEquals(checkSwitchGenerationCase(BIGINT, values), DIRECT_SWITCH); values.add(new ConstantExpression(33L, BIGINT)); assertEquals(checkSwitchGenerationCase(BIGINT, values), SET_CONTAINS); }