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 assertGenerateBinaryOperationExpression() {
        ConditionValueCompareOperatorGenerator conditionValueCompareOperatorGenerator = new ConditionValueCompareOperatorGenerator();
        BinaryOperationExpression rightValue = new BinaryOperationExpression(0, 0, mock(ColumnSegment.class), new LiteralExpressionSegment(0, 0, 1), "=", null);
        Optional<ShardingConditionValue> actual = conditionValueCompareOperatorGenerator.generate(rightValue, column, new LinkedList<>(), mock(TimestampServiceRule.class));
        Optional<ShardingConditionValue> expected = ConditionValueGeneratorFactory.generate(rightValue, column, new LinkedList<>(), mock(TimestampServiceRule.class));
        assertTrue(actual.isPresent() && expected.isPresent());
        assertThat(actual.get().getTableName(), is(expected.get().getTableName()));
        assertThat(actual.get().getColumnName(), is(expected.get().getColumnName()));
    }