2016-04-23 11 views
1

Ich benutze Couchbase Java SDK 2.2.6 mit Couchbase Server 4.1.Do Couchbase reaktive Clients garantieren Reihenfolge der Zeilen in Ansicht Abfrage Ergebnis

ich Abfrage meiner Ansicht nach mit dem folgenden Code

public <T> List<T> findDocuments(ViewQuery query, String bucketAlias, Class<T> clazz) { 
    // We specifically set reduce false and include docs to retrieve docs 
    query.reduce(false).includeDocs(); 
    log.debug("Find all documents, query = {}", decode(query)); 
    return getBucket(bucketAlias) 
      .query(query) 
      .allRows() 
      .stream() 
      .map(row -> fromJsonDocument(row.document(), clazz)) 
      .collect(Collectors.toList()); 
} 

private static <A> A fromJsonDocument(JsonDocument saved, Class<A> clazz) { 
    log.debug("Retrieved json document -> {}", saved); 
    A object = fromJson(saved.content(), clazz); 
    return object; 
} 

In den Protokollen der fromJsonDocument Methode, die ich sehe, dass Zeilen nicht immer durch den Zeilenschlüssel sortiert. Normalerweise sind sie, aber manchmal nicht.

Wenn ich diese Abfrage nur im Browser Couchbase GUI ausführen, erhalte ich immer Ergebnisse in der erwarteten Reihenfolge. Ist es ein Fehler oder erwartet, dass die Ergebnisse der Ansichtsabfrage nicht sortiert werden, wenn sie mit einem asynchronen Client abgefragt werden? Was ist das Verhalten in verschiedenen Clients, nicht Java?

Antwort

1

Dies liegt an der asynchronen Art Ihres Aufrufs im Java-Client + die Tatsache, dass Sie includeDocs verwendet haben.

Was includeDocs tun wird ist, dass es in einem Aufruf an get für jede Dokument-ID weben wird, die von der Ansicht empfangen wird. Wenn Sie also die asynchrone Sequenz AsyncViewRow mit includeDocs betrachten, sehen Sie sich tatsächlich eine Zusammenstellung einer Zeile an, die von der Ansicht zurückgegeben wird, und eine asynchrone Abfrage des gesamten Dokuments.

Wenn ein Dokumentenabruf im Vergleich zu der vorherigen Zeile ein wenig Latenz aufweist, könnte die Ausgabe (Zeile + Dok) neu angeordnet werden.

Aber gute Nachrichten alle! Es gibt eine includeDocsOrdered Alternative in der ViewQuery, die genau die gleichen Parameter wie includeDocs nimmt aber sicherstellen wird, dass AsyncViewRow in der gleichen Reihenfolge kommt, die von der Ansicht zurückgegeben wird.

Dies wird getan, indem eifrig die get Retrievals ausgelöst, aber diejenigen, die außer Betrieb geraten, gepuffert werden, um die ursprüngliche Reihenfolge beizubehalten, ohne zu viel Leistung zu opfern.

Das ist sehr spezifisch für den Java-Client mit seiner Verwendung von RxJava. Ich bin nicht einmal sicher, dass andere Kunden die Idee haben, includeDocs ...

+0

Vielen Dank! Jetzt sehe ich, dass es in Version 2.2.5 hinzugefügt wurde und ich vermisste diese neue Methode. –