2015-04-25 1 views
1

Je crée une vue dans le code en utilisant l'API Java 2.1.2 Couchbase comme ceci:Création de vues Couchbase dans le code: retourne première requête 0 lignes, index construit en arrière-plan

DefaultView view = DefaultView.create(viewName, jsMapFunctionAsString); 
List<View> views = new ArrayList<>(); 
views.add(view); 
DesignDocument doc = DesignDocument.create(name, views); 
bucket.bucketManager().insertDesignDocument(doc); 

Appel ViewResult result = bucket.query(ViewQuery.from(name, viewName)) directement après l'insertion du document, viewResult.success() retourne toujours vrai, mais les deux itérateurs rows() et iterator retournent 0 lignes (il y a certainement des résultats présents.Quand j'exécute la vue dans l'interface Web, il renvoie des valeurs correctes).

La solution que je trouve au bout de quelques heures est d'appeler query deux fois avec assez de temps d'attente entre comme

ViewResult result = bucket.query(ViewQuery.from(name, viewName)); 
Thread.sleep(10000); 
result = bucket.query(ViewQuery.from(name, viewName)); 

Le deuxième appel sera ensuite retourner le résultat correct.

Il semble que Couchbase doive d'abord construire l'index pour la requête, mais retourne directement, même avant la construction de l'index.
Attendre 10 secondes n'est bien sûr pas optimal, peut-être que la création de l'index prendra plus de temps dans le futur. Donc, ma question est: comment puis-je m'assurer que j'attends seulement que l'index soit construit?
Est-ce un bug dans l'API?

+0

@Bohemian Avec la version 3, ils ont introduit un langage de requête de type SQL appelé N1QL. Je n'ai pas encore essayé. Nous sommes très satisfaits de Couchbase, mais nous n'avons pas non plus besoin de beaucoup de requêtes. – Sebastian

+1

@Sebastian Il y a un [aperçu du développeur] (http://docs.couchbase.com/4.0/admin/whats-new.html#topic_hdg_nkd_54) de Couchbase Server 4 qui prend en charge N1QL, les index secondaires globaux et multidimensionnels index spatiaux avec lesquels vous pourriez vouloir jouer. – Paddy

Répondre

3

Vous pouvez utiliser la méthode stale et la définir sur false dans le ViewQuery, ce qui forcera à attendre que l'indexation se termine avant de renvoyer les résultats.

+0

C'est gentil! Je vais le vérifier lundi. – Sebastian

+0

Il suffit de réaliser que, ce faisant, vous pouvez obtenir un hit de performance sur l'interrogation de vue si vous ne dimensionnez pas votre cluster pour faire stale = false. – Kirk

+0

@Kirk Bon à savoir. Puisque nous n'aurons pas de vues insérées dynamiquement en production, cela ne nous posera aucun problème. – Sebastian