Многочисленные сегменты и запросы пространственного представления в Spring Couchbase

Несколько блоков и запросов пространственного представления в Spring Couchbase

1. Вступление

В этом третьем руководстве по Spring Data Couchbase мы продемонстрируем конфигурацию, необходимую для поддержки модели данных Couchbase, охватывающей несколько сегментов, и представим использование пространственных представлений для запроса многомерных данных.

2. Модель данных

В дополнение к сущностиPerson изour first tutorial иStudent изour second tutorial, мы определяем сущностьCampus для этого руководства:

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

    @Field
    @NotNull
    private String name;

    @Field
    @NotNull
    private Point location;

    // standard getters and setters
}

3. Конфигурация Java для нескольких сегментов Couchbase

Чтобы использовать несколько сегментов в вашем проекте, вам нужно будет использовать версию 2.0.0 или более позднюю версию модуля Spring Data Couchbase, и вам нужно будет использовать конфигурацию на основе Java, поскольку конфигурация на основе XML поддерживает только одно ведущие сценарии.

Вот зависимость, которую мы включаем в наш файл Mavenpom.xml:


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

3.1. Определение Bucket Bean

В нашем руководствеIntroduction to Spring Data Couchbase мы обозначили“example” как имя нашей корзины Couchbase по умолчанию для использования с Spring Data.

Мы будем хранитьCampus объектов в корзине“example2”.

Чтобы использовать вторую корзину, мы сначала должны определить@Bean для самогоBucket в нашем классе конфигурации Couchbase:

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

3.2. Настройка компонента шаблона

Затем мы определяем@Bean дляCouchbaseTemplate, который будет использоваться с этим ведром:

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

3.3. Отображение репозиториев

Наконец, мы определяем настраиваемое отображение операций репозитория Couchbase, чтобы класс сущностиCampus использовал новый шаблон и сегмент, в то время как другие классы сущностей продолжали использовать шаблон и сегмент по умолчанию:

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

4. Запрос пространственных или многомерных данных

Couchbase предоставляет встроенную поддержку для выполнения запросов ограничивающего прямоугольника к двумерным данным, таким как географические данные, с использованием специального типа представления, известного какSpatial view.

Запрос ограничивающего прямоугольника - это запрос диапазона, который использует самую юго-западную точку[x,y] блока в качестве параметраstartRange и самую северо-западную точку[x,y] в качестве параметраendRange. .

Spring Data расширяет встроенную функцию запроса ограничивающего прямоугольника Couchbase для запросов, включающих круги и многоугольники, используя алгоритм, который стремится исключить ложноположительные совпадения, а также обеспечивает поддержку запросов, включающих более двух измерений.

Spring Data упрощает создание многомерных запросов с помощью набора ключевых слов, которые можно использовать для определения производных запросов в репозиториях Couchbase.

4.1. Поддерживаемые типы данных

Запросы репозитория Spring Data Couchbase поддерживают типы данных из пакетаorg.springframework.data.geo, включаяPoint, Box, Circle, Polygon, иDistance.

4.2. Ключевые слова производного запроса

В дополнение к стандартным ключевым словам репозитория Spring Data, репозитории Couchbase поддерживают следующие ключевые слова в производных запросах, включающих два измерения:

  • Within,InWithin (принимает два параметраPoint, определяющих ограничивающий прямоугольник)

  • Near,IsNear (принимает в качестве параметровPoint иDistance)

И следующие ключевые слова могут использоваться для запросов, включающих более двух измерений:

  • Between (для добавления одного числового значения кstartRange иendRange)

  • GreaterThan, GreaterThanEqual, After (для добавления одного числового значения кstartRange)

  • LessThan, LessThanEqual, Before (для добавления одного числового значения кendRange)

Вот несколько примеров методов производных запросов, использующих эти ключевые слова:

  • findByLocationNear

  • findByLocationWithin

  • findByLocationNearAndPopulationGreaterThan

  • findByLocationWithinAndAreaLessThan

  • findByLocationNearAndTuitionBetween

5. Определение репозитория

Методы репозитория, поддерживаемые пространственными представлениями, должны быть украшены аннотацией@Dimensional, которая указывает имя проектного документа, имя представления и количество измерений, используемых для определения ключа представления (по умолчанию 2, если не указано иное).

5.1. Интерфейс CampusRespository

Здесь, в нашем интерфейсеCampusRepository, мы объявляем два метода - один, который использует традиционные ключевые слова Spring Data, поддерживаемый представлением MapReduce, и другой, который использует ключевые слова размерных Spring Data, поддерживаемых пространственным представлением:

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. Пространственные виды

Пространственные представления написаны как функции JavaScript, во многом как представления MapReduce. В отличие от представлений MapReduce, которые состоят как из функцииmap, так и из функцииreduce, пространственные представления состоят только из функцииspatial и могут не сосуществовать в одном проектном документе Couchbase с представлениями MapReduce.

Для наших сущностейCampus мы создадим проектный документ с именем“campus_spatial”, содержащий пространственное представление с именем“byLocation” со следующей функцией:

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

Как показывает этот пример, когда вы пишете функцию пространственного представления, ключ, используемый в вызове функцииemit, должен быть массивом из двух или более значений.

5.3. MapReduce Просмотры

Чтобы обеспечить полную поддержку нашего репозитория, мы должны создать проектный документ с именем“campus”, содержащий два представления MapReduce:“all” и“byName”.

Вот функция карты для представления“all”:

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

А вот функция карты для представления“byName”:

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

6. Заключение

Мы показали, как настроить ваш проект Spring Data Couchbase для поддержки использования нескольких сегментов, и продемонстрировали, как использовать абстракцию репозитория для написания запросов пространственного представления к многомерным данным.

Вы можете просмотреть полный исходный код этого руководства вthe github project.

Чтобы узнать больше о Spring Data Couchbase, посетите официальный сайт проектаSpring Data Couchbase.