Vários buckets e consultas de exibição espacial no Couchbase do Spring Data

Vários buckets e consultas de exibição espacial no Couchbase do Spring Data

1. Introdução

Neste terceiro tutorial sobre o Spring Data Couchbase, demonstramos a configuração necessária para oferecer suporte a um modelo de dados do Couchbase que abrange vários buckets e introduzimos o uso de visualizações espaciais para consultar dados multidimensionais.

2. Modelo de dados

Além da entidadePerson deour first tutorial e da entidadeStudent deour second tutorial, definimos uma entidadeCampus para este tutorial:

@Document
public class Campus {
    @Id
    private String id;

    @Field
    @NotNull
    private String name;

    @Field
    @NotNull
    private Point location;

    // standard getters and setters
}

3. Configuração Java para vários intervalos Couchbase

Para usar vários buckets em seu projeto, você precisará usar a versão 2.0.0 ou posterior do módulo Spring Data Couchbase e usar uma configuração baseada em Java, porque a configuração baseada em XML suporta apenas cenários de balde.

Aqui está a dependência que incluímos em nosso arquivo Mavenpom.xml:


    org.springframework.data
    spring-data-couchbase
    2.1.1.RELEASE

3.1. Definindo o Bucket Bean

Em nosso tutorialIntroduction to Spring Data Couchbase, designamos“example” como o nome de nosso bucket Couchbase padrão para uso com Spring Data.

ArmazenaremosCampus entidades no depósito“example2”.

Para fazer uso de um segundo intervalo, primeiro devemos definir um@Bean para o próprioBucket em nossa classe de configuração Couchbase:

@Bean
public Bucket campusBucket() throws Exception {
    return couchbaseCluster().openBucket("example2", "");
}

3.2. Configurando o Template Bean

A seguir, definimos um@Bean paraCouchbaseTemplate a ser usado com este intervalo:

@Bean
public CouchbaseTemplate campusTemplate() throws Exception {
    CouchbaseTemplate template = new CouchbaseTemplate(
      couchbaseClusterInfo(), campusBucket(),
      mappingCouchbaseConverter(), translationService());
    template.setDefaultConsistency(getDefaultConsistency());
    return template;
}

3.3. Mapeando os Repositórios

Finalmente, definimos um mapeamento personalizado das operações do repositório Couchbase para que a classe de entidadeCampus use o novo modelo e intervalo, enquanto outras classes de entidade continuarão a usar o modelo e intervalo padrão:

@Override
public void configureRepositoryOperationsMapping(
  RepositoryOperationsMapping baseMapping) {
    try {
        baseMapping.mapEntity(Campus.class, campusTemplate());
    } catch (Exception e) {
        //custom Exception handling
    }
}

4. Consulta de dados espaciais ou multidimensionais

O Couchbase fornece suporte nativo para a execução de consultas de caixa delimitadora em dados bidimensionais, como dados geográficos, usando um tipo especial de visualização conhecido comoSpatial view.

Uma consulta de caixa delimitadora é uma consulta de intervalo que usa o ponto[x,y] mais a sudoeste da caixa como seu parâmetrostartRange e o ponto[x,y] mais a noroeste como seu parâmetroendRange .

Spring Data estende o recurso de consulta de caixa delimitadora nativa do Couchbase para consultas envolvendo círculos e polígonos usando um algoritmo que busca eliminar correspondências positivas falsas e também fornece suporte para consultas envolvendo mais de duas dimensões.

O Spring Data simplifica a criação de consultas multidimensionais por meio de um conjunto de palavras-chave que podem ser usadas para definir consultas derivadas nos repositórios do Couchbase.

4.1. Tipos de dados suportados

As consultas do repositório Spring Data Couchbase suportam tipos de dados do pacoteorg.springframework.data.geo, incluindoPoint, Box, Circle, Polygon,eDistance.

4.2. Palavras-chave de consulta derivadas

Além das palavras-chave padrão do repositório Spring Data, os repositórios do Couchbase suportam as seguintes palavras-chave em consultas derivadas que envolvem duas dimensões:

  • Within,InWithin (leva dois parâmetrosPoint definindo uma caixa delimitadora)

  • Near,IsNear (levaPointeDistance como parâmetros)

E as seguintes palavras-chave podem ser usadas para consultas que envolvam mais de duas dimensões:

  • Between (para adicionar um único valor numérico astartRange eendRange)

  • GreaterThan, GreaterThanEqual, After (para adicionar um único valor numérico aostartRange)

  • LessThan, LessThanEqual, Before (para adicionar um único valor numérico aoendRange)

Aqui estão alguns exemplos de métodos de consulta derivados usando estas palavras-chave:

  • findByLocationNear

  • findByLocationWithin

  • findByLocationNearAndPopulationGreaterThan

  • findByLocationWithinAndAreaLessThan

  • findByLocationNearAndTuitionBetween

5. Definindo o Repositório

Os métodos de repositório apoiados por vistas espaciais devem ser decorados com a anotação@Dimensional, que especifica o nome do documento de design, nome da vista e número de dimensões usadas para definir a chave da vista (padrão 2 se não for especificado de outra forma).

5.1. A interface CampusRespository

Aqui em nossa interfaceCampusRepository, declaramos dois métodos - um que usa palavras-chave Spring Data tradicionais, apoiado por uma visualização MapReduce, e outro que usa palavras-chave Spring Data dimensionais, apoiado por uma visualização Espacial:

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. Vistas Espaciais

As visualizações espaciais são escritas como funções JavaScript, assim como as visualizações do MapReduce. Ao contrário das visualizações MapReduce, que consistem em uma funçãomap e em uma funçãoreduce, as visualizações espaciais consistem em apenas uma funçãospatial e podem não coexistir no mesmo documento de design Couchbase como visualizações MapReduce.

Para nossas entidadesCampus, criaremos um documento de design denominado“campus_spatial” contendo uma visualização espacial denominada“byLocation” com a seguinte função:

function (doc) {
  if (doc.location &&
      doc._class == "org.example.spring.data.couchbase.model.Campus") {
    emit([doc.location.x, doc.location.y], null);
  }
}

Como este exemplo demonstra, quando você escreve uma função de visualização Espacial, a chave usada na chamada de funçãoemit deve ser uma matriz de dois ou mais valores.

5.3. Visualizações de MapReduce

Para fornecer suporte completo para nosso repositório, devemos criar um documento de design denominado“campus” contendo duas visualizações MapReduce:“all”e“byName”.

Aqui está a função de mapa para a visualização“all”:

function (doc, meta) {
  if(doc._class == "org.example.spring.data.couchbase.model.Campus") {
    emit(meta.id, null);
  }
}

E aqui está a função de mapa para a visualização“byName”:

function (doc, meta) {
  if(doc._class == "org.example.spring.data.couchbase.model.Campus" &&
     doc.name) {
    emit(doc.name, null);
  }
}

6. Conclusão

Mostramos como configurar seu projeto Spring Data Couchbase para suportar o uso de vários buckets e demonstramos como usar a abstração do repositório para escrever consultas de exibição espacial em dados multidimensionais.

Você pode ver o código-fonte completo deste tutorial emthe github project.

Para aprender mais sobre Spring Data Couchbase, visite o site oficial do projetoSpring Data Couchbase.