2016-01-12 2 views
0

Je lié un conteneur de requête Lazy à Vaadin Grille en suivant les exemples à https://vaadin.com/wiki/-/wiki/Main/Lazy%20Query%20Container/Vaadin Grid et LazyQueryContainer

Ces exemples nécessitent les implémentations de requête pour avoir une méthode taille public int @Override (). Apparemment, Grid utilise cette méthode pour obtenir le nombre total d'objets qui seront affichés lorsque le conteneur est défini.

La méthode de taille nécessite le comptage et le balayage de table complet, ce qui est très coûteux dans notre cas. Au lieu de définir immédiatement la taille, nous souhaitons la modifier/la mettre à jour dans chaque appel loadItems "@Override public Liste loadItems (int startIndex, int count)".

Quelle est la meilleure façon de notifier le conteneur (et éventuellement la grille utilisant ce conteneur) à propos de la dernière taille connue?

Existe-t-il également un exemple de définition de la taille paresseuse?

Merci d'avance.

+0

J'ai personnellement pas encore utilisé, mais je soupçonne que la taille est nécessaire pour la _pagination_. Sans connaître le nombre d'éléments présents dans la base de données, il est difficile de déterminer quel bloc charger lors du chargement public de la liste loadItems (int startIndex, int count) ' – Morfic

+0

Le report de l'estimation de la taille à l'appel loadItems vous aide-t-il? La taille est nécessaire dans ce type de modèle d'interface utilisateur de toute façon sur le premier rendu. Je reviendrai à la "pagination traditionnelle" au niveau de l'interface utilisateur si vous ne pouvez pas optimiser la requête de comptage. Certains utilisent (pour ce problème générique) une table distincte et des déclencheurs SQL. – mstahv

+0

Merci pour vos réponses. Voici ce que j'ai essayé et jusqu'à présent, cela n'a pas fonctionné: J'ai défini la taille de LazyContainer sur Integer.MAX_VALUE. Chaque appel de méthode loadItems, interrogera l'intervalle demandé à partir de la base de données et si ce n'est pas la dernière page, il gardera la taille en entier max. S'il s'agit de la dernière page, il définira la taille correcte pour le conteneur. Ainsi, le conteneur lui-même semble fonctionner. Mais, Grid vérifie la taille uniquement lorsque le conteneur initialement affecté à la grille. Et ne réinterroge jamais la taille avant ou après la méthode loadItems call.it suppose toujours que la taille est la même. – turgos

Répondre

1

J'ai une solution écrite avec un petit "cache" et Spring Data Solr. Dans ce cas, les demandes ne sont transmises que lorsque cela est nécessaire. Vous pouvez l'agrandir ou le modifier pour vos besoins.

SolrLazyQuery (Pagination) mit Vaadin Grid und Spring Data Solr

final LazyPagedContainer<T> container = new LazyPagedContainer<>(this.currentGenericClass); 
container.setLazyQuery(new LazyContainerQuery<T>(firstPage) { 

    @Override 
    protected Page<T> getPageByNumber(final int pageNumber) { 
     final SolrPageRequest solrPage = new SolrPageRequest(pageNumber, PAGE_SIZE, MyGrid.this.currentSort); 
     return MyGrid.this.search(solrPage, MyGrid.this.currentSearch, MyGrid.this.currentFilterValues); 
    } 
}); 

Vaadin Grid/Table requests to this query: 
startIndex: 0, numberOfIds: 95 
startIndex: 0, numberOfIds: 139 
startIndex: 52, numberOfIds: 171 
startIndex: 137, numberOfIds: 171 
[...] 

Requests to Solr: 
start: 0 rows: 100 
start: 100 rows: 100 
start: 200 rows: 100 
start: 300 rows: 100 
[...] 
+0

Merci pour la réponse Alexander. Je vais essayer dans quelques jours et partager le résultat. – turgos