Plusieurs compartiments et requêtes de vue spatiale dans Spring Data Couchbase

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.