2017-07-21 1 views
1

Si j'annoter une classe avec des annotations de com.datastax.driver.mapping.annotations, je peux écrire un test le long des lignes de:Comment puis-je examiner la chaîne de requête générée par Spring données Cassandra Mapper

MappingManager manager = new MappingManager(session); 
Mapper<MyAnnotatedClass> mapper = manager.mapper(MyAnnotatedClass.class); 

MyAnnotatedClass entity = ...; 

RegularStatement saveQuery = (RegularStatement) mapper.saveQuery(entity); 

assertEquals("...", saveQuery.getQueryString()); 

Cependant, j'ai classes d'entités annotée avec org.springframework.data.cassandra.mapping annotations. J'ai été incapable de trouver un ressort équivalent à saveQuery(), getQuery() et deleteQuery() de Mapper.

Comment puis-je écrire (idéalement léger lors de l'exécution) des tests concernant le CQL généré à partir des classes d'entités annotées Cassandra de Spring Data?

+0

Il n'existe aucune prise en charge de test pour vérifier les instructions dérivées des classes d'entités annotées Cassandra de Spring Data. Quelle est votre motivation derrière les tests de chaîne de requête? – mp911de

+0

@ mp911de Je veux un moyen piloté par les tests pour évaluer la relation de cause à effet lorsque vous travaillez sur les annotations. On pourrait soutenir que seule la cause et l'effet de ce qui se retrouve dans les tableaux sont importants, mais pour l'instant, je préférerais quelque chose de plus contractuel. – slim

Répondre

3

avec des données Spring pour Apache Cassandra 1.5, vous pouvez écrire le code suivant pour créer Statement s:

CassandraTemplate template = … 

Person person = … 

CqlIdentifier tableName = template.getTableName(Person.class); 

Insert insert = CassandraTemplate.createInsertQuery(tableName.toCql(), person, 
        new WriteOptions(), template.getConverter()); 

Delete delete = CassandraTemplate.createDeleteQuery(tableName.toCql(), person, 
        new WriteOptions(), template.getConverter()); 

Update update = CassandraTemplate.createUpdateQuery(tableName.toCql(), person, 
        new WriteOptions(), template.getConverter()); 

Note: Les données Spring pour Apache Cassandra 1.5 utilise BATCH déclarations pour les insertions, qui va changer avec la version 2.0.

CassandraTemplate et CassandraConverter sont les classes clés impliquées dans la création de requêtes pour la version 1.5. Dans Spring Data 2.0, les choses vont changer un peu car 2.0 va être livré avec des types supplémentaires Query et Update pour les mises à jour d'entités partielles. La création de requêtes passe ainsi de CassandraTemplate.create…Query(…) à QueryUtils.create…Query(…).

+0

Cela fonctionne comme un charme - merci. Y a-t-il quelque chose de similaire pour 'SELECT'? – slim

+1

Non, parce que dans 1.5, vous devez passer un 'Select' ou un select en utilisant CQL simple. Vous pouvez plonger plus profondément pour créer des prédicats 'WHERE' en fonction du type d'entité et de l'ID (https://github.com/spring-projects/spring-data-cassandra/blob/6b683f4346c6476f3c80e56e6bcd0df5b3eed4bc/spring-data-cassandra/src/main/java /org/springframework/data/cassandra/core/CassandraTemplate.java#L179-L182) mais c'est assez lourd. – mp911de