public static Optional<ShardingConditionValue> generate(final ExpressionSegment predicate, final Column column, final List<Object> params, final TimestampServiceRule timestampServiceRule) {
        if (predicate instanceof BinaryOperationExpression) {
            return COMPARE_OPERATOR_GENERATOR.generate((BinaryOperationExpression) predicate, column, params, timestampServiceRule);
        }
        if (predicate instanceof InExpression) {
            return IN_OPERATOR_GENERATOR.generate((InExpression) predicate, column, params, timestampServiceRule);
        }
        if (predicate instanceof BetweenExpression) {
            return BETWEEN_OPERATOR_GENERATOR.generate((BetweenExpression) predicate, column, params, timestampServiceRule);
        }
        return Optional.empty();
    }
@Test
    void assertGenerateInOperationExpression() {
        ConditionValueInOperatorGenerator conditionValueInOperatorGenerator = new ConditionValueInOperatorGenerator();
        ColumnSegment left = new ColumnSegment(0, 0, new IdentifierValue("id"));
        ListExpression right = new ListExpression(0, 0);
        right.getItems().add(new ParameterMarkerExpressionSegment(0, 0, 0));
        Optional<ShardingConditionValue> actual = conditionValueInOperatorGenerator.generate(
                new InExpression(0, 0, left, right, false), column, Collections.singletonList(1), mock(TimestampServiceRule.class));
        Optional<ShardingConditionValue> expected = ConditionValueGeneratorFactory.generate(
                new InExpression(0, 0, left, right, false), column, Collections.singletonList(1), mock(TimestampServiceRule.class));
        assertTrue(actual.isPresent() && expected.isPresent());
        assertThat(actual.get().getColumnName(), is(expected.get().getColumnName()));
        assertThat(actual.get().getTableName(), is(expected.get().getTableName()));
    }