InsertOptimizeEngineTest.java 8.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 * Copyright 1999-2015 dangdang.com.
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * </p>
 */

package io.shardingjdbc.core.optimizer;

20 21
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
22
import io.shardingjdbc.core.api.algorithm.sharding.ListShardingValue;
23 24
import io.shardingjdbc.core.optimizer.condition.ShardingConditions;
import io.shardingjdbc.core.optimizer.insert.InsertOptimizeEngine;
25
import io.shardingjdbc.core.optimizer.insert.InsertShardingCondition;
26 27 28
import io.shardingjdbc.core.parsing.parser.context.condition.AndCondition;
import io.shardingjdbc.core.parsing.parser.context.condition.Column;
import io.shardingjdbc.core.parsing.parser.context.condition.Condition;
29 30
import io.shardingjdbc.core.parsing.parser.context.insertvalue.InsertValue;
import io.shardingjdbc.core.parsing.parser.context.table.Table;
31
import io.shardingjdbc.core.parsing.parser.expression.SQLPlaceholderExpression;
32 33 34
import io.shardingjdbc.core.parsing.parser.sql.dml.insert.InsertStatement;
import io.shardingjdbc.core.parsing.parser.token.InsertValuesToken;
import io.shardingjdbc.core.parsing.parser.token.TableToken;
35
import io.shardingjdbc.core.routing.router.sharding.GeneratedKey;
36 37 38 39
import io.shardingjdbc.core.rule.ShardingRule;
import io.shardingjdbc.core.yaml.sharding.YamlShardingConfiguration;
import org.hamcrest.CoreMatchers;
import org.junit.Before;
40 41
import org.junit.Test;

42 43 44 45 46
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
47 48 49 50 51 52 53

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;

public final class InsertOptimizeEngineTest {
    
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
    private ShardingRule shardingRule;
    
    private InsertStatement insertStatement;
    
    private List<Object> parameters;
    
    @Before
    public void setUp() throws IOException {
        URL url = InsertOptimizeEngineTest.class.getClassLoader().getResource("yaml/optimize-rule.yaml");
        Preconditions.checkNotNull(url, "Cannot found rewrite rule yaml configuration.");
        YamlShardingConfiguration yamlShardingConfig = YamlShardingConfiguration.unmarshal(new File(url.getFile()));
        shardingRule = yamlShardingConfig.getShardingRule(yamlShardingConfig.getDataSources().keySet());
        insertStatement = new InsertStatement();
        insertStatement.getTables().add(new Table("t_order", Optional.<String>absent()));
        insertStatement.setParametersIndex(4);
        insertStatement.setInsertValuesListLastPosition(45);
        insertStatement.getSqlTokens().add(new TableToken(12, "t_order"));
        insertStatement.getSqlTokens().add(new InsertValuesToken(39, "t_order"));
        AndCondition andCondition1 = new AndCondition();
        andCondition1.getConditions().add(new Condition(new Column("user_id", "t_order"), new SQLPlaceholderExpression(0)));
        insertStatement.getConditions().getOrCondition().getAndConditions().add(andCondition1);
        AndCondition andCondition2 = new AndCondition();
        andCondition2.getConditions().add(new Condition(new Column("user_id", "t_order"), new SQLPlaceholderExpression(2)));
        insertStatement.getConditions().getOrCondition().getAndConditions().add(andCondition2);
        insertStatement.getInsertValues().getInsertValues().add(new InsertValue("(?, ?)", 2));
        insertStatement.getInsertValues().getInsertValues().add(new InsertValue("(?, ?)", 2));
        parameters = new ArrayList<>(4);
        parameters.add(10);
        parameters.add("init");
        parameters.add(11);
        parameters.add("init");
85 86 87
    }
    
    @Test
88 89 90 91 92
    public void assertOptimizeWithGeneratedKey() {
        GeneratedKey generatedKey = new GeneratedKey(new Column("order_id", "t_order"));
        generatedKey.getGeneratedKeys().add(1);
        generatedKey.getGeneratedKeys().add(2);
        ShardingConditions actual = new InsertOptimizeEngine(shardingRule, insertStatement, parameters, generatedKey).optimize();
93
        assertFalse(actual.isAlwaysFalse());
94 95 96 97 98 99 100 101 102 103 104
        assertThat(actual.getShardingConditions().size(), is(2));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(0)).getParameters().size(), is(3));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(1)).getParameters().size(), is(3));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(0)).getParameters().get(0), CoreMatchers.<Object>is(10));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(0)).getParameters().get(1), CoreMatchers.<Object>is("init"));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(0)).getParameters().get(2), CoreMatchers.<Object>is(1));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(1)).getParameters().get(0), CoreMatchers.<Object>is(11));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(1)).getParameters().get(1), CoreMatchers.<Object>is("init"));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(1)).getParameters().get(2), CoreMatchers.<Object>is(2));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(0)).getInsertValueExpression(), is("(?, ?, ?)"));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(1)).getInsertValueExpression(), is("(?, ?, ?)"));
105
        assertThat(actual.getShardingConditions().get(0).getShardingValues().size(), is(2));
106 107 108 109 110
        assertThat(actual.getShardingConditions().get(1).getShardingValues().size(), is(2));
        assertShardingValue((ListShardingValue) actual.getShardingConditions().get(0).getShardingValues().get(0), 10);
        assertShardingValue((ListShardingValue) actual.getShardingConditions().get(0).getShardingValues().get(1), 1);
        assertShardingValue((ListShardingValue) actual.getShardingConditions().get(1).getShardingValues().get(0), 11);
        assertShardingValue((ListShardingValue) actual.getShardingConditions().get(1).getShardingValues().get(1), 2);
111 112 113
    }
    
    @Test
114 115 116
    public void assertOptimizeWithoutGeneratedKey() {
        insertStatement.setGenerateKeyColumnIndex(1);
        ShardingConditions actual = new InsertOptimizeEngine(shardingRule, insertStatement, parameters, null).optimize();
117
        assertFalse(actual.isAlwaysFalse());
118 119 120 121 122 123 124 125 126
        assertThat(actual.getShardingConditions().size(), is(2));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(0)).getParameters().size(), is(2));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(1)).getParameters().size(), is(2));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(0)).getParameters().get(0), CoreMatchers.<Object>is(10));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(0)).getParameters().get(1), CoreMatchers.<Object>is("init"));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(1)).getParameters().get(0), CoreMatchers.<Object>is(11));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(1)).getParameters().get(1), CoreMatchers.<Object>is("init"));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(0)).getInsertValueExpression(), is("(?, ?)"));
        assertThat(((InsertShardingCondition) actual.getShardingConditions().get(1)).getInsertValueExpression(), is("(?, ?)"));
127
        assertThat(actual.getShardingConditions().get(0).getShardingValues().size(), is(1));
128 129 130
        assertThat(actual.getShardingConditions().get(1).getShardingValues().size(), is(1));
        assertShardingValue((ListShardingValue) actual.getShardingConditions().get(0).getShardingValues().get(0), 10);
        assertShardingValue((ListShardingValue) actual.getShardingConditions().get(1).getShardingValues().get(0), 11);
131 132
    }
    
133
    private void assertShardingValue(final ListShardingValue actual, final int expected) {
134
        assertThat(actual.getValues().size(), is(1));
135
        assertThat((int) actual.getValues().iterator().next(), is(expected));
136 137
    }
}