/*
* Copyright (C) 2012-2015 DataStax Inc.
*
* 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.
*/
package com.datastax.driver.core.querybuilder;
import com.datastax.driver.core.*;
import com.datastax.driver.core.exceptions.SyntaxError;
import com.datastax.driver.core.utils.CassandraVersion;
import org.testng.annotations.Test;
import static com.datastax.driver.core.querybuilder.QueryBuilder.*;
import static org.testng.Assert.*;
@CCMConfig(clusterProvider = "createClusterBuilderNoDebouncing")
public class QueryBuilderITest extends CCMTestsSupport {
private static final String TABLE_TEXT = "test_text";
private static final String TABLE_INT = "test_int";
@Override
public void onTestContextInitialized() {
execute(String.format("CREATE TABLE %s (k text PRIMARY KEY, a int, b int)", TABLE_TEXT),
String.format("CREATE TABLE %s (k int PRIMARY KEY, a int, b int)", TABLE_INT));
}
@Test(groups = "short")
public void remainingDeleteTests() throws Exception {
Statement query;
TableMetadata table = cluster().getMetadata().getKeyspace(keyspace).getTable(TABLE_TEXT);
assertNotNull(table);
String expected = String.format("DELETE k FROM %s.test_text;", keyspace);
query = delete("k").from(table);
assertEquals(query.toString(), expected);
try {
session().execute(query);
fail();
} catch (SyntaxError e) {
// Missing WHERE clause
}
}
@Test(groups = "short")
public void selectInjectionTests() throws Exception {
String query;
Statement select;
PreparedStatement ps;
BoundStatement bs;
session().execute("CREATE TABLE foo ( k ascii PRIMARY KEY , i int, s ascii )");
query = "SELECT * FROM foo WHERE k=?;";
select = select().all().from("foo").where(eq("k", bindMarker()));
ps = session().prepare(select.toString());
bs = ps.bind();
assertEquals(select.toString(), query);
session().execute(bs.setString("k", "4 AND c=5"));
}
@Test(groups = "short")
@CassandraVersion(value = "2.0.7", description = "DELETE..IF EXISTS only supported in 2.0.7+ (CASSANDRA-5708)")
public void conditionalDeletesTest() throws Exception {
session().execute(String.format("INSERT INTO %s.test_int (k, a, b) VALUES (1, 1, 1)", keyspace));
Statement delete;
Row row;
delete = delete().from(keyspace, TABLE_INT).where(eq("k", 2)).ifExists();
row = session().execute(delete).one();
assertFalse(row.getBool("[applied]"));
delete = delete().from(keyspace, TABLE_INT).where(eq("k", 1)).ifExists();
row = session().execute(delete).one();
assertTrue(row.getBool("[applied]"));
session().execute(String.format("INSERT INTO %s.test_int (k, a, b) VALUES (1, 1, 1)", keyspace));
delete = delete().from(keyspace, TABLE_INT).where(eq("k", 1)).onlyIf(eq("a", 1)).and(eq("b", 2));
row = session().execute(delete).one();
assertFalse(row.getBool("[applied]"));
delete = delete().from(keyspace, TABLE_INT).where(eq("k", 1)).onlyIf(eq("a", 1)).and(eq("b", 1));
row = session().execute(delete).one();
assertTrue(row.getBool("[applied]"));
}
@Test(groups = "short")
@CassandraVersion(value = "2.0.13", description = "Allow IF EXISTS for UPDATE statements (CASSANDRA-8610)")
public void conditionalUpdatesTest() throws Exception {
session().execute(String.format("INSERT INTO %s.test_int (k, a, b) VALUES (1, 1, 1)", keyspace));
Statement update;
Row row;
update = update(TABLE_INT).with(set("a", 2)).and(set("b", 2)).where(eq("k", 2)).ifExists();
row = session().execute(update).one();
assertFalse(row.getBool("[applied]"));
update = update(TABLE_INT).with(set("a", 2)).and(set("b", 2)).where(eq("k", 1)).ifExists();
row = session().execute(update).one();
assertTrue(row.getBool("[applied]"));
update = update(TABLE_INT).with(set("a", 2)).and(set("b", 2)).where(eq("k", 2)).onlyIf(eq("a", 1)).and(eq("b", 2));
row = session().execute(update).one();
assertFalse(row.getBool("[applied]"));
update = update(TABLE_INT).with(set("a", 3)).and(set("b", 3)).where(eq("k", 1)).onlyIf(eq("a", 2)).and(eq("b", 2));
row = session().execute(update).one();
assertTrue(row.getBool("[applied]"));
update = update(TABLE_INT).with(set("a", 4)).and(set("b", 4)).onlyIf(eq("a", 2)).and(eq("b", 2)).where(eq("k", 1));
row = session().execute(update).one();
assertFalse(row.getBool("[applied]"));
update = update(TABLE_INT).with(set("a", 4)).and(set("b", 4)).onlyIf(eq("a", 3)).and(eq("b", 3)).where(eq("k", 1));
row = session().execute(update).one();
assertTrue(row.getBool("[applied]"));
}
}