Можете ли вы использовать Lightcouch для запроса документов по фильтру? - PullRequest
0 голосов
/ 09 июля 2019

Я использую lightcouch для своего приложения весенней загрузки, и мне нужно иметь возможность запрашивать в моей базе данных CouchDb документы на основе предоставленного фильтра.Поскольку эти фильтры всегда могут быть разными, я не могу использовать предустановленное представление.Я ищу что-то, что будет работать аналогично обычному поиску, как показано ниже:

public List<MyEntity> getEntities(MyFilter myFilter)
{
   return dbClient.find(resourceFilter, MyEntity.class);
}

myFilter будет объектом Map, который я буду использовать для запроса документов на основе определенных значений, представленных в этой карте.Является ли это возможным?Есть ли подход для достижения того, чего я хочу?Спасибо

Ответы [ 2 ]

1 голос
/ 11 июля 2019

LightCouch предоставляет метод для запроса CouchDB с использованием селекторов манго.

См. CouchDbClientBase.java

 /**
 * Find documents using a declarative JSON querying syntax.
 * @param <T> The class type.
 * @param jsonQuery The JSON query string.
 * @param classOfT The class of type T.
 * @return The result of the query as a {@code List<T> }
 * @throws CouchDbException If the query failed to execute or the request is invalid.
 */
public <T> List<T> findDocs(String jsonQuery, Class<T> classOfT) { ...
1 голос
/ 09 июля 2019

LightCouch внутренний API позволяет выполнить пользовательский необработанный HTTP-запрос к базе данных.Это можно сделать с помощью метода CouchDbClient # executeRequest .

Я не использую LightCouch в своем проекте Java, но Apache HTTPClient вместе с GSON.В приведенном ниже примере предполагается, что CouchDB устанавливается на вашем локальном компьютере, а пользователь и пароль должны быть «admin».Его можно легко адаптировать для использования CouchDbClient#executeRequest.

Параметр mangoSelector в методе find должен соответствовать синтаксису селектора CouchDB .

public class CouchDBAccess {

    private static final String BASE_URL = "http://localhost:5984/";
    private static final Gson GSON = new GsonBuilder().create();

    private final Header[] httpHeaders;

    public CouchDBAccess() {
        this.httpHeaders = new Header[] { //
                new BasicHeader("Accept", "application/json"), //
                new BasicHeader("Content-type", "application/json"), //
                new BasicHeader("Authorization", "Basic " + Base64.getEncoder().encodeToString("admin:admin".getBytes())) //
        };
    }

    FindResult find(String dbName, String mangoSelector) throws IOException {
        try (CloseableHttpClient client = HttpClientBuilder.create().build()) {
            HttpPost httpPost = new HttpPost(BASE_URL + dbName + "/_find");
            httpPost.setHeaders(httpHeaders);
            httpPost.setEntity(new StringEntity(mangoSelector, ContentType.APPLICATION_JSON));
            HttpResponse response = client.execute(httpPost);
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode == HttpStatus.SC_OK) {
                return GSON.fromJson(extractContent(response), FindResult.class);
            } else {
                // handle invalid response
            }
        }
    }

    private String extractContent(HttpResponse response) throws IOException {
        StringWriter writer = new StringWriter();
        IOUtils.copy(response.getEntity().getContent(), writer, defaultCharset());
        return writer.toString();
    }
}

class FindResult {
    MyEntity[] docs;
}

Соответствующий метод тестирования jUnit может выглядеть следующим образом:

@Test
public void testFind() throws IOException {
    String mangoSelector = "{\"selector\": {\"Host\": \"local drive\"}}";
    FindResult findResult = couchDBAccess.find("data_1", mangoSelector);

    assertEquals(100, findResult.docs.length); // or whatever you expect
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...