Sondes multiples et requêtes d'affichage spatial dans Spring Data Couchbase
1. introduction
Dans ce troisième tutoriel sur Spring Data Couchbase, nous montrons la configuration requise pour prendre en charge un modèle de données Couchbase couvrant plusieurs compartiments et introduisons l'utilisation de vues spatiales pour interroger des données multidimensionnelles.
2. Modèle de données
En plus de l'entitéPerson deour first tutorial et de l'entitéStudent deour second tutorial, nous définissons une entitéCampus pour ce tutoriel:
@Document
public class Campus {
@Id
private String id;
@Field
@NotNull
private String name;
@Field
@NotNull
private Point location;
// standard getters and setters
}
3. Configuration Java pour plusieurs compartiments Couchbase
Pour pouvoir utiliser plusieurs compartiments dans votre projet, vous devez utiliser la version 2.0.0 ou ultérieure du module Spring Data Couchbase et une configuration basée sur Java, car la configuration basée sur XML ne prend en charge que les processus uniques. scénarios de seau.
Voici la dépendance que nous incluons dans notre fichier Mavenpom.xml:
org.springframework.data
spring-data-couchbase
2.1.1.RELEASE
3.1. Définition du Bucket Bean
Dans notre tutoriel surIntroduction to Spring Data Couchbase, nous avons désigné“example” comme le nom de notre bucket Couchbase par défaut à utiliser avec Spring Data.
Nous allons stocker les entitésCampus dans le bucket“example2”.
Pour utiliser un second bucket, nous devons d'abord définir un@Bean pour leBucket lui-même dans notre classe de configuration Couchbase:
@Bean
public Bucket campusBucket() throws Exception {
return couchbaseCluster().openBucket("example2", "");
}
3.2. Configuration du bean modèle
Ensuite, nous définissons un@Bean pour lesCouchbaseTemplate à utiliser avec ce compartiment:
@Bean
public CouchbaseTemplate campusTemplate() throws Exception {
CouchbaseTemplate template = new CouchbaseTemplate(
couchbaseClusterInfo(), campusBucket(),
mappingCouchbaseConverter(), translationService());
template.setDefaultConsistency(getDefaultConsistency());
return template;
}
3.3. Mappage des référentiels
Enfin, nous définissons un mappage personnalisé des opérations du référentiel Couchbase afin que la classe d'entitéCampus utilise le nouveau modèle et le nouveau compartiment, tandis que les autres classes d'entité continueront à utiliser le modèle et le compartiment par défaut:
@Override
public void configureRepositoryOperationsMapping(
RepositoryOperationsMapping baseMapping) {
try {
baseMapping.mapEntity(Campus.class, campusTemplate());
} catch (Exception e) {
//custom Exception handling
}
}
4. Interroger des données spatiales ou multidimensionnelles
Couchbase fournit un support natif pour exécuter des requêtes de boîte englobante sur des données bidimensionnelles, telles que des données géographiques, en utilisant un type de vue spécial appeléSpatial view.
Une requête de boîte englobante est une requête de plage qui utilise le point[x,y] le plus au sud-ouest de la boîte comme paramètrestartRange et le point le plus au nord-ouest[x,y] comme paramètreendRange .
Spring Data étend la fonctionnalité de requête de boîte englobante native de Couchbase aux requêtes impliquant des cercles et des polygones à l'aide d'un algorithme qui cherche à éliminer les faux positifs, et il prend également en charge les requêtes impliquant plus de deux dimensions.
Spring Data simplifie la création de requêtes multidimensionnelles grâce à un ensemble de mots-clés pouvant être utilisés pour définir des requêtes dérivées dans des référentiels Couchbase.
4.1. Types de données pris en charge
Les requêtes de référentiel Spring Data Couchbase prennent en charge les types de données du packageorg.springframework.data.geo, y comprisPoint, Box, Circle, Polygon, etDistance.
4.2. Mots clés de requête dérivés
Outre les mots-clés standard du référentiel Spring Data, les référentiels Couchbase prennent en charge les mots-clés suivants dans les requêtes dérivées impliquant deux dimensions:
-
Within,InWithin (prend deux paramètresPoint définissant une boîte englobante)
-
Near,IsNear (prend unPoint etDistance comme paramètres)
Et les mots-clés suivants peuvent être utilisés pour les requêtes impliquant plus de deux dimensions:
-
Between (pour ajouter une seule valeur numérique auxstartRange etendRange)
-
GreaterThan, GreaterThanEqual, After (pour ajouter une seule valeur numérique auxstartRange)
-
LessThan, LessThanEqual, Before (pour ajouter une seule valeur numérique auxendRange)
Voici quelques exemples de méthodes de requête dérivées utilisant ces mots clés:
-
findByLocationNear
-
findByLocationWithin
-
findByLocationNearAndPopulationGreaterThan
-
findByLocationWithinAndAreaLessThan
-
findByLocationNearAndTuitionBetween
5. Définition du référentiel
Les méthodes de référentiel soutenues par les vues spatiales doivent être décorées avec l’annotation@Dimensional, qui spécifie le nom du document de conception, le nom de la vue et le nombre de dimensions utilisées pour définir la clé de la vue (par défaut 2 sauf indication contraire).
5.1. L'interface CampusRespository
Ici, dans notre interfaceCampusRepository, nous déclarons deux méthodes - une qui utilise des mots-clés Spring Data traditionnels, soutenus par une vue MapReduce, et une qui utilise des mots-clés Spring Data dimensionnels, soutenus par une vue Spatiale:
public interface CampusRepository extends CrudRepository {
@View(designDocument="campus", viewName="byName")
Set findByName(String name);
@Dimensional(dimensions=2, designDocument="campus_spatial",
spatialViewName="byLocation")
Set findByLocationNear(Point point, Distance distance);
}
5.2. Vues spatiales
Les vues spatiales sont écrites comme des fonctions JavaScript, un peu comme les vues MapReduce. Contrairement aux vues MapReduce, qui se composent à la fois d'une fonctionmap et d'une fonctionreduce, les vues spatiales se composent uniquement d'une fonctionspatial et peuvent ne pas coexister dans le même document de conception Couchbase que les vues MapReduce.
Pour nos entitésCampus, nous allons créer un document de conception nommé“campus_spatial” contenant une vue spatiale nommée“byLocation” avec la fonction suivante:
function (doc) {
if (doc.location &&
doc._class == "org.example.spring.data.couchbase.model.Campus") {
emit([doc.location.x, doc.location.y], null);
}
}
Comme le montre cet exemple, lorsque vous écrivez une fonction de vue spatiale, la clé utilisée dans l'appel de fonctionemit doit être un tableau de deux valeurs ou plus.
5.3. Vues MapReduce
Pour fournir une prise en charge complète de notre référentiel, nous devons créer un document de conception nommé“campus” contenant deux vues MapReduce:“all” et“byName”.
Voici la fonction de carte pour la vue“all”:
function (doc, meta) {
if(doc._class == "org.example.spring.data.couchbase.model.Campus") {
emit(meta.id, null);
}
}
Et voici la fonction de carte pour la vue“byName”:
function (doc, meta) {
if(doc._class == "org.example.spring.data.couchbase.model.Campus" &&
doc.name) {
emit(doc.name, null);
}
}
6. Conclusion
Nous avons montré comment configurer votre projet Spring Data Couchbase pour prendre en charge l'utilisation de plusieurs compartiments, ainsi que l'utilisation de l'abstraction de référentiel pour écrire des requêtes de vue spatiale sur des données multidimensionnelles.
Vous pouvez afficher le code source complet de ce didacticiel dansthe github project.
Pour en savoir plus sur Spring Data Couchbase, visitez le site officiel du projetSpring Data Couchbase.