@Override
    public Optional<ShardingConditionValue> generate(final InExpression predicate, final Column column, final List<Object> params, final TimestampServiceRule timestampServiceRule) {
        if (predicate.isNot()) {
            return Optional.empty();
        }
        Collection<ExpressionSegment> expressionSegments = predicate.getExpressionList();
        List<Integer> parameterMarkerIndexes = new ArrayList<>(expressionSegments.size());
        List<Comparable<?>> shardingConditionValues = new LinkedList<>();
        for (ExpressionSegment each : expressionSegments) {
            ConditionValue conditionValue = new ConditionValue(each, params);
            Optional<Comparable<?>> value = conditionValue.getValue();
            if (conditionValue.isNull()) {
                shardingConditionValues.add(null);
                conditionValue.getParameterMarkerIndex().ifPresent(parameterMarkerIndexes::add);
                continue;
            }
            if (value.isPresent()) {
                shardingConditionValues.add(value.get());
                conditionValue.getParameterMarkerIndex().ifPresent(parameterMarkerIndexes::add);
                continue;
            }
            if (ExpressionConditionUtils.isNowExpression(each)) {
                shardingConditionValues.add(timestampServiceRule.getTimestamp());
            }
        }
        return shardingConditionValues.isEmpty() ? Optional.empty()
                : Optional.of(new ListShardingConditionValue<>(column.getName(), column.getTableName(), shardingConditionValues, parameterMarkerIndexes));
    }
@Test
    void assertNotInExpression() {
        ColumnSegment left = new ColumnSegment(0, 0, new IdentifierValue("id"));
        ListExpression right = new ListExpression(0, 0);
        right.getItems().add(new ParameterMarkerExpressionSegment(0, 0, 0));
        InExpression inExpression = new InExpression(0, 0, left, right, true);
        Optional<ShardingConditionValue> shardingConditionValue = generator.generate(inExpression, column, Collections.singletonList(1), timestampServiceRule);
        assertFalse(shardingConditionValue.isPresent());
    }