/*
* Copyright 2017 the original author or authors.
*
* 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 org.springframework.data.cassandra.core;
import static org.assertj.core.api.Assertions.*;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
import org.springframework.data.annotation.Id;
import org.springframework.data.cassandra.convert.CassandraConverter;
import org.springframework.data.cassandra.convert.MappingCassandraConverter;
import org.springframework.data.cassandra.convert.UpdateMapper;
import org.springframework.data.cassandra.core.query.Columns;
import org.springframework.data.cassandra.core.query.Criteria;
import org.springframework.data.cassandra.core.query.Query;
import org.springframework.data.cassandra.core.query.Update;
import org.springframework.data.cassandra.domain.Group;
import org.springframework.data.cassandra.mapping.CassandraPersistentEntity;
import org.springframework.data.cassandra.mapping.Column;
import org.springframework.data.domain.Sort;
import com.datastax.driver.core.Statement;
/**
* Unit tests for {@link StatementFactory}.
*
* @author Mark Paluch
*/
public class StatementFactoryUnitTests {
CassandraConverter converter = new MappingCassandraConverter();
UpdateMapper updateMapper = new UpdateMapper(converter);
StatementFactory statementFactory = new StatementFactory(updateMapper, updateMapper);
CassandraPersistentEntity<?> groupEntity = converter.getMappingContext().getRequiredPersistentEntity(Group.class);
CassandraPersistentEntity<?> personEntity = converter.getMappingContext().getRequiredPersistentEntity(Person.class);
@Test // DATACASS-343
public void shouldMapSimpleSelectQuery() {
Statement select = statementFactory.select(Query.empty(),
converter.getMappingContext().getRequiredPersistentEntity(Group.class));
assertThat(select.toString()).isEqualTo("SELECT * FROM group;");
}
@Test // DATACASS-343
public void shouldMapSelectQueryWithColumnsAndCriteria() {
Query query = Query.query(Criteria.where("foo").is("bar")).columns(Columns.from("age"));
Statement select = statementFactory.select(query, groupEntity);
assertThat(select.toString()).isEqualTo("SELECT age FROM group WHERE foo='bar';");
}
@Test // DATACASS-343
public void shouldMapSelectQueryWithTtlColumns() {
Query query = Query.empty().columns(Columns.empty().ttl("email"));
Statement select = statementFactory.select(query,
converter.getMappingContext().getRequiredPersistentEntity(Group.class));
assertThat(select.toString()).isEqualTo("SELECT TTL(email) FROM group;");
}
@Test // DATACASS-343
public void shouldMapSelectQueryWithSortLimitAndAllowFiltering() {
Query query = Query.empty().sort(Sort.by("id.hashPrefix")).limit(10).withAllowFiltering();
Statement select = statementFactory.select(query,
converter.getMappingContext().getRequiredPersistentEntity(Group.class));
assertThat(select.toString()).isEqualTo("SELECT * FROM group ORDER BY hash_prefix ASC LIMIT 10 ALLOW FILTERING;");
}
@Test // DATACASS-343
public void shouldMapDeleteQueryWithColumns() {
Query query = Query.empty().columns(Columns.from("age"));
Statement delete = statementFactory.delete(query,
converter.getMappingContext().getRequiredPersistentEntity(Group.class));
assertThat(delete.toString()).isEqualTo("DELETE age FROM group;");
}
@Test // DATACASS-343
public void shouldMapDeleteQueryWithTtlColumns() {
Query query = Query.query(Criteria.where("foo").is("bar"));
Statement delete = statementFactory.delete(query,
converter.getMappingContext().getRequiredPersistentEntity(Group.class));
assertThat(delete.toString()).isEqualTo("DELETE FROM group WHERE foo='bar';");
}
@Test // DATACASS-343
public void shouldCreateSetUpdate() {
Query query = Query.query(Criteria.where("foo").is("bar"));
Statement update = statementFactory.update(query, Update.empty().set("firstName", "baz").set("boo", "baa"),
personEntity);
assertThat(update.toString()).isEqualTo("UPDATE person SET first_name='baz',boo='baa' WHERE foo='bar';");
}
@Test // DATACASS-343
public void shouldCreateSetAtIndexUpdate() {
Statement update = statementFactory.update(Query.empty(), Update.empty().set("list").atIndex(10).to("Euro"),
personEntity);
assertThat(update.toString()).isEqualTo("UPDATE person SET list[10]='Euro';");
}
@Test // DATACASS-343
public void shouldCreateSetAtKeyUpdate() {
Statement update = statementFactory.update(Query.empty(), Update.empty().set("map").atKey("baz").to("Euro"),
personEntity);
assertThat(update.toString()).isEqualTo("UPDATE person SET map['baz']='Euro';");
}
@Test // DATACASS-343
public void shouldAddToMap() {
Statement update = statementFactory.update(Query.empty(), Update.empty().addTo("map").entry("foo", "Euro"),
personEntity);
assertThat(update.toString()).isEqualTo("UPDATE person SET map=map+{'foo':'Euro'};");
}
@Test // DATACASS-343
public void shouldPrependAllToList() {
Statement update = statementFactory.update(Query.empty(), Update.empty().addTo("list").prependAll("foo", "Euro"),
personEntity);
assertThat(update.toString()).isEqualTo("UPDATE person SET list=['foo','Euro']+list;");
}
@Test // DATACASS-343
public void shouldAppendAllToList() {
Statement update = statementFactory.update(Query.empty(), Update.empty().addTo("list").appendAll("foo", "Euro"),
personEntity);
assertThat(update.toString()).isEqualTo("UPDATE person SET list=list+['foo','Euro'];");
}
@Test // DATACASS-343
public void shouldRemoveFromList() {
Statement update = statementFactory.update(Query.empty(), Update.empty().remove("list", "Euro"), personEntity);
assertThat(update.toString()).isEqualTo("UPDATE person SET list=list-['Euro'];");
}
@Test // DATACASS-343
public void shouldClearList() {
Statement update = statementFactory.update(Query.empty(), Update.empty().clear("list"), personEntity);
assertThat(update.toString()).isEqualTo("UPDATE person SET list=[];");
}
@Test // DATACASS-343
public void shouldAddAllToSet() {
Statement update = statementFactory.update(Query.empty(), Update.empty().addTo("set").appendAll("foo", "Euro"),
personEntity);
assertThat(update.toString()).isEqualTo("UPDATE person SET set_col=set_col+{'foo','Euro'};");
}
@Test // DATACASS-343
public void shouldRemoveFromSet() {
Statement update = statementFactory.update(Query.empty(), Update.empty().remove("set", "Euro"), personEntity);
assertThat(update.toString()).isEqualTo("UPDATE person SET set_col=set_col-{'Euro'};");
}
@Test // DATACASS-343
public void shouldClearSet() {
Statement update = statementFactory.update(Query.empty(), Update.empty().clear("set"), personEntity);
assertThat(update.toString()).isEqualTo("UPDATE person SET set_col={};");
}
@Test // DATACASS-343
public void shouldCreateIncrementUpdate() {
Statement update = statementFactory.update(Query.empty(), Update.empty().increment("number"), personEntity);
assertThat(update.toString()).isEqualTo("UPDATE person SET number=number+1;");
}
@Test // DATACASS-343
public void shouldCreateDecrementUpdate() {
Statement update = statementFactory.update(Query.empty(), Update.empty().decrement("number"), personEntity);
assertThat(update.toString()).isEqualTo("UPDATE person SET number=number-1;");
}
static class Person {
@Id String id;
List<String> list;
@Column("set_col") Set<String> set;
Map<String, String> map;
Integer number;
@Column("first_name") String firstName;
}
}