/*
* Licensed to CRATE Technology GmbH ("Crate") under one or more contributor
* license agreements. See the NOTICE file distributed with this work for
* additional information regarding copyright ownership. Crate licenses
* this file to you 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.
*
* However, if you have executed another commercial license agreement
* with Crate these terms will supersede the license and you may use the
* software solely pursuant to the terms of the relevant commercial agreement.
*/
package io.crate.integrationtests;
import io.crate.testing.SQLResponse;
import io.crate.testing.SQLTransportExecutor;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import static com.google.common.collect.Maps.newHashMap;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
public class Setup {
private final SQLTransportExecutor transportExecutor;
public Setup(SQLTransportExecutor transportExecutor) {
this.transportExecutor = transportExecutor;
}
public void setUpLocations() throws Exception {
transportExecutor.exec("create table locations (" +
" id string primary key," +
" name string," +
" date timestamp," +
" kind string," +
" position integer," +
" description string," +
" race object," +
" index name_description_ft using fulltext(name, description) with (analyzer='english')" +
") clustered by(id) into 2 shards with(number_of_replicas=0)");
String insertStmt = "insert into locations " +
"(id, name, date, kind, position, description, race) " +
"values (?, ?, ?, ?, ?, ?, ?)";
Object[][] rows = new Object[][]{
new Object[]{"1", "North West Ripple", "1979-10-12",
"Galaxy", 1, "Relative to life on NowWhat, living on an affluent " +
"world in the North West ripple of the Galaxy is said to be easier " +
"by a factor of about seventeen million.", null
},
new Object[]{
"2", "Outer Eastern Rim", "1979-10-12", "Galaxy", 2, "The Outer Eastern Rim " +
"of the Galaxy where the Guide has supplanted the Encyclopedia Galactica " +
"among its more relaxed civilisations.", null
},
new Object[]{
"3", "Galactic Sector QQ7 Active J Gamma", "2013-05-01", "Galaxy", 4,
"Galactic Sector QQ7 Active J Gamma contains the Sun Zarss, " +
"the planet Preliumtarn of the famed Sevorbeupstry and " +
"Quentulus Quazgar Mountains.", null
},
new Object[]{
"4", "Aldebaran", "2013-07-16", "Star System", 1,
"Max Quordlepleen claims that the only thing left after the end " +
"of the Universe will be the sweets trolley and a fine selection " +
"of Aldebaran liqueurs.", null
},
new Object[]{
"5", "Algol", "2013-07-16", "Star System", 2,
"Algol is the home of the Algolian Suntiger, " +
"the tooth of which is one of the ingredients of the " +
"Pan Galactic Gargle Blaster.", null
},
new Object[]{
"6", "Alpha Centauri", "1979-10-12", "Star System", 3,
"4.1 light-years northwest of earth", null
},
new Object[]{
"7", "Altair", "2013-07-16", "Star System", 4,
"The Altairian dollar is one of three freely convertible currencies in the galaxy, " +
"though by the time of the novels it had apparently recently collapsed.",
null
},
new Object[]{
"8", "Allosimanius Syneca", "2013-07-16", "Planet", 1,
"Allosimanius Syneca is a planet noted for ice, snow, " +
"mind-hurtling beauty and stunning cold.", null
},
new Object[]{
"9", "Argabuthon", "2013-07-16", "Planet", 2,
"It is also the home of Prak, a man placed into solitary confinement " +
"after an overdose of truth drug caused him to tell the Truth in its absolute " +
"and final form, causing anyone to hear it to go insane.", null,
},
new Object[]{
"10", "Arkintoofle Minor", "1979-10-12", "Planet", 3,
"Motivated by the fact that the only thing in the Universe that " +
"travels faster than light is bad news, the Hingefreel people native " +
"to Arkintoofle Minor constructed a starship driven by bad news.", null
},
new Object[]{
"11", "Bartledan", "2013-07-16", "Planet", 4,
"An Earthlike planet on which Arthur Dent lived for a short time, " +
"Bartledan is inhabited by Bartledanians, a race that appears human but only physically.",
new HashMap<String, Object>() {{
put("name", "Bartledannians");
put("description", "Similar to humans, but do not breathe");
put("interests", "netball");
}}
},
new Object[]{
"12", "", "2013-07-16", "Planet", 5, "This Planet doesn't really exist", null
},
new Object[]{
"13", "End of the Galaxy", "2013-07-16", "Galaxy", 6, "The end of the Galaxy.%", null
}
};
transportExecutor.execBulk(insertStmt, rows);
}
public void groupBySetup() throws Exception {
groupBySetup("integer");
}
public void groupBySetup(String numericType) throws Exception {
transportExecutor.exec(String.format(Locale.ENGLISH, "create table characters (" +
" race string," +
" gender string," +
" age %s," +
" birthdate timestamp," +
" name string," +
" details object as (job string)," +
" details_ignored object(ignored)" +
")", numericType));
transportExecutor.ensureYellowOrGreen();
Map<String, String> details = newHashMap();
details.put("job", "Sandwitch Maker");
transportExecutor.exec("insert into characters (race, gender, age, birthdate, name, details) values (?, ?, ?, ?, ?, ?)",
new Object[]{"Human", "male", 34, "1975-10-01", "Arthur Dent", details});
details = newHashMap();
details.put("job", "Mathematician");
transportExecutor.exec("insert into characters (race, gender, age, birthdate, name, details) values (?, ?, ?, ?, ?, ?)",
new Object[]{"Human", "female", 32, "1978-10-11", "Trillian", details});
transportExecutor.exec("insert into characters (race, gender, age, birthdate, name, details) values (?, ?, ?, ?, ?, ?)",
new Object[]{"Human", "female", 43, "1970-01-01", "Anjie", null});
transportExecutor.exec("insert into characters (race, gender, age, name) values (?, ?, ?, ?)",
new Object[]{"Human", "male", 112, "Ford Perfect"});
transportExecutor.exec("insert into characters (race, gender, name) values ('Android', 'male', 'Marving')");
transportExecutor.exec("insert into characters (race, gender, name) values ('Vogon', 'male', 'Jeltz')");
transportExecutor.exec("insert into characters (race, gender, name) values ('Vogon', 'male', 'Kwaltz')");
transportExecutor.exec("refresh table characters");
}
public void setUpEmployees() {
transportExecutor.exec("create table employees (" +
" name string, " +
" department string," +
" hired timestamp, " +
" age short," +
" income double, " +
" good boolean" +
") with (number_of_replicas=0)");
transportExecutor.ensureGreen();
transportExecutor.exec("insert into employees (name, department, hired, age, income, good) values (?, ?, ?, ?, ?, ?)",
new Object[]{"dilbert", "engineering", "1985-01-01", 47, 4000.0, true});
transportExecutor.exec("insert into employees (name, department, hired, age, income, good) values (?, ?, ?, ?, ?, ?)",
new Object[]{"wally", "engineering", "2000-01-01", 54, 6000.0, true});
transportExecutor.exec("insert into employees (name, department, hired, age, income, good) values (?, ?, ?, ?, ?, ?)",
new Object[]{"pointy haired boss", "management", "2010-10-10", 45, Double.MAX_VALUE, false});
transportExecutor.exec("insert into employees (name, department, hired, age, income, good) values (?, ?, ?, ?, ?, ?)",
new Object[]{"catbert", "HR", "1990-01-01", 12, 999999999.99, false});
transportExecutor.exec("insert into employees (name, department, income) values (?, ?, ?)",
new Object[]{"ratbert", "HR", 0.50});
transportExecutor.exec("insert into employees (name, department, age) values (?, ?, ?)",
new Object[]{"asok", "internship", 28});
transportExecutor.exec("refresh table employees");
}
public void setUpObjectTable() {
transportExecutor.exec("create table ot (" +
" title string," +
" author object(dynamic) as (" +
" name object(strict) as (" +
" first_name string," +
" last_name string" +
" )," +
" age integer" +
" )," +
" details object(ignored) as (" +
" num_pages integer" +
" )" +
") with (number_of_replicas = 0)");
transportExecutor.exec("insert into ot (title, author, details) values (?, ?, ?)",
new Object[]{
"The Hitchhiker's Guide to the Galaxy",
new HashMap<String, Object>() {{
put("name", new HashMap<String, Object>() {{
put("first_name", "Douglas");
put("last_name", "Adams");
}});
put("age", 49);
}},
new HashMap<String, Object>() {{
put("num_pages", 224);
}}
}
);
transportExecutor.exec("refresh table ot");
}
public void setUpArrayTables() {
transportExecutor.exec("create table any_table (" +
" id int primary key," +
" temps array(double)," +
" names array(string)," +
" tags array(string)" +
") with (number_of_replicas=0)");
transportExecutor.ensureGreen();
SQLResponse response = transportExecutor.exec("insert into any_table (id, temps, names, tags) values (?,?,?,?), (?,?,?,?), (?,?,?,?), (?,?,?,?)",
1, Arrays.asList(0L, 0L, 0L), Arrays.asList("Dornbirn", "Berlin", "St. Margrethen"), Arrays.asList("cool"),
2, Arrays.asList(0, 1, -1), Arrays.asList("Dornbirn", "Dornbirn", "Dornbirn"), Arrays.asList("cool", null),
3, Arrays.asList(42, -42), Arrays.asList("Hangelsberg", "Berlin"), Arrays.asList("kuhl", "cool"),
4, null, null, Arrays.asList("kuhl", null)
);
assertThat(response.rowCount(), is(4L));
transportExecutor.exec("refresh table any_table");
}
public void partitionTableSetup() {
transportExecutor.exec("create table parted (" +
"id int primary key," +
"date timestamp primary key," +
"o object(ignored)" +
") partitioned by (date) with (number_of_replicas=0)");
transportExecutor.ensureGreen();
transportExecutor.exec("insert into parted (id, date) values (1, '2014-01-01')");
transportExecutor.exec("insert into parted (id, date) values (2, '2014-01-01')");
transportExecutor.exec("insert into parted (id, date) values (3, '2014-02-01')");
transportExecutor.exec("insert into parted (id, date) values (4, '2014-02-01')");
transportExecutor.exec("refresh table parted");
}
public void createTestTableWithPrimaryKey() {
transportExecutor.exec("create table test (" +
" pk_col string primary key, " +
" message string" +
") with (number_of_replicas=0)");
transportExecutor.ensureGreen();
}
public void setUpCharacters() {
transportExecutor.exec("create table characters (id int primary key, name string, female boolean, details object)");
transportExecutor.ensureYellowOrGreen();
transportExecutor.execBulk("insert into characters (id, name, female) values (?, ?, ?)",
new Object[][]{
new Object[]{1, "Arthur", false},
new Object[]{2, "Ford", false},
new Object[]{3, "Trillian", true},
new Object[]{4, "Arthur", true}
}
);
transportExecutor.exec("refresh table characters");
}
}