Как выполнять многомерные запросы в CouchDB / Cloudant

not необходимо поместить реализацию в файл заголовка, см. альтернативное решение в конце этого ответа.

В любом случае причина, по которой ваш код не работает, что при создании экземпляра шаблона компилятор создает новый класс с заданным аргументом шаблона. Например:

template
struct Foo
{
    T bar;
    void doSomething(T param) {/* do stuff using T */}
};

// somewhere in a .cpp
Foo f; 

При чтении этой строки компилятор создаст новый класс (назовем его FooInt), что эквивалентно следующему:

struct FooInt
{
    int bar;
    void doSomething(int param) {/* do stuff using int */}
}

Следовательно, компилятор должен иметь доступ к реализации методов, чтобы создать экземпляр с аргументом шаблона (в данном случае int). Если эти реализации не были в заголовке, они не были бы доступны, поэтому компилятор не смог бы создать экземпляр шаблона.

Общим решением для этого является запись объявления шаблона в заголовок файла, затем реализовать класс в файле реализации (например, .tpp) и включить этот файл реализации в конец заголовка.

// Foo.h
template 
struct Foo
{
    void doSomething(T param);
};

#include "Foo.tpp"

// Foo.tpp
template 
void Foo::doSomething(T param)
{
    //implementation
}

Таким образом, реализация по-прежнему отделена от объявления, но доступен компилятору.

Другое решение состоит в том, чтобы сохранить реализацию отдельно и явно создать все экземпляры шаблона, которые вам понадобятся:

// Foo.h

// no implementation
template  struct Foo { ... };

//----------------------------------------    
// Foo.cpp

// implementation of Foo's methods

// explicit instantiations
template class Foo;
template class Foo;
// You will only be able to use Foo with int or float

Если мое объяснение isn ' t достаточно ясно, вы можете взглянуть на C ++ Super-FAQ по этому вопросу .

0
задан user3188040 13 July 2018 в 17:22
поделиться

2 ответа

Вы должны иметь возможность использовать язык запросов N1QL для запросов, подобных этому, без проблем. N1QL доступен только для Couchbase, а не для проекта CouchDB, из которого вырос Couchbase.

Например, если я понимаю ваш первый запрос там, вы можете записать его как это в N1QL:

SELECT * 
FROM datapoints 
WHERE lat BETWEEN -72 AND -70 AND
      lng BETWEEN 40 AND 50  AND
      time BETWEEN 1531500769 AND 1530500000

Чтобы выполнить такой запрос эффективно, вам понадобится индекс, например:

CREATE INDEX lat_long_time_idx ON datapoints(lat, lng, time)

Здесь вы можете узнать больше о N1QL: https: // query-tutorial .couchbase.com / учебник / # 1

0
ответ дан Johan Larson 17 August 2018 в 12:21
поделиться
  • 1
    Спасибо, я использую Cloudant и, к сожалению, N1QL недоступен. Но Cloudant Query (Mango) доступен, поэтому я попробую это вместо этого. – user3188040 14 July 2018 в 22:01

Печально CouchDB крайне плохо справляется с этими разновидностями многомерных запросов. Вы можете иметь вид на любую из осей, но нет простого способа получить пересечение, как вы описали.

Однако в начале этого проекта было написано расширение для обработки запросов GeoSpatial (lat, длинный), называемый GeoCouch, и это расширение было включено в платформу Cloudant, которую вы, похоже, используете. Это означает, что вы можете делать прямые запросы в комбинации lat / long, а не по оси времени, используя формат GeoJSON: https://console.bluemix.net/docs/services/Cloudant/api/cloudant-geo. html # cloudant-nosql-db-geospatial

Однако у Cloudant также есть другая система запросов - Query: https://console.bluemix.net/docs/services/Cloudant/api /cloudant_query.html#query

. В этой системе вы можете создать сводный индекс над вашими документами и затем запросить документы, имеющие определенные критерии. Например, этот селектор запросов найдет документы с годами в диапазоне 1900-1903:

{
"selector": {
    "year": {
        "$gte": 1900
    },
    "year": {
        "$lte": 1903
    }
},

Таким образом, мне кажется, что вы можете индексировать три значения, которые вам нужны (Lat, Long и Time) и постройте 3-осевой запрос в Cloudant. Однако я этого не пробовал.

0
ответ дан Ewan Makepeace 17 August 2018 в 12:21
поделиться