2017-10-18 18 views
3

Nous avons implémenté un chargement de grille paresseux basé sur l'article Vaadin Blog et nous souhaitons ajouter des filtres pour certaines colonnes de grille. Dans ce cas, nous effectuons un chargement paresseux en définissant une fonction lambda en tant que CallbackDataProvider. Veuillez consulter le code ci-dessous. Comment peut-on combiner CallbackDataProvider avec le filtrage?Vaadin Grid - Plusieurs filtres avec chargement Lazy

Selon ce StackOverflow post, l'auteur pourrait résoudre ce problème en utilisant ConfigurableFilterDataProvider comme un wrapper sur CallbackDataProvider. Malheureusement, il n'a pas partagé d'autres codes. Pouvez-vous s'il vous plaît nous fournir des conseils pour y parvenir?

Notre code est entièrement basé sur l'article du blog et se présente comme suit:

public class Person { 
    private Long id; 
    private String firstName; 
    private String lastName; 
    private String email; 
    ... getter and setters ... 
} 

public class PersonService { 
    public List<Person> findAll(int offset, int limit) { ... } 
    public int count() { ... } 
} 

Réglage du DataProvider:

grid.setDataProvider(
    (sortOrders, offset, limit) -> { 
    Map<String, Boolean> sortOrder = sortOrders.stream().collect(
     Collectors.toMap(
     sort -> sort.getSorted(), 
     sort -> SortDirection.ASCENDING.equals(sort.getDirection()) 
     ) 
    ); 
    return service.findAll(offset, limit, sortOrder).stream(); 
    }, 
() -> service.count() 
); 

Répondre

0

Dans l'exemple en utilisant la grille de type Map<String, Object>. Implémentation getCount() ignorée.

public ConfigurableFilterDataProvider<Map<String, Object>, Void, MyFilter> getFilteredDataProvider(String table) 
    { 
     DataProvider<Map<String, Object>, MyFilter> dataProvider = DataProvider.fromFilteringCallbacks(query -> { 
      List<Map<String, Object>> list = fetchFilteredItems(table, query.getOffset(), query.getLimit(), query.getFilter()); 
      return list.stream(); 
     }, query -> getCount(table, query.getFilter())); 


     return dataProvider.withConfigurableFilter(); 
    } 


private List<Map<String, Object>> fetchFilteredItems(String table, int offset, int limit, Optional<MyFilter> filter) 
    { 
     long tStart = System.currentTimeMillis(); 
     String sql; 

     if (filter.isPresent() && !filter.get().getSql(true).isEmpty()) 
     { 
      sql = "SELECT * FROM (" 
        + "SELECT * FROM(" 
         + "SELECT rownum rn, t.* FROM " + table + " t " 
         + filter.get().getSql() + ") " 
        + "WHERE rownum <= " + (limit+offset) + ") " 
       + "WHERE rn > " + offset; 
     } 
     else 
     { 
      sql = "SELECT * FROM (" 
        + "SELECT rownum rn, t.* FROM " + table + " t" 
        + " WHERE rownum <= " + (limit+offset) + ") WHERE rn > " + offset; 
     } 

     List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, new Object[]{}); 
     return result; 
    } 

Définition fournisseur de données et ajouter le filtre:

ConfigurableFilterDataProvider<Map<String, Object>, Void, MyFilter> dataProvider = getFilteredDataProvider("myTable"); 
dataProvider.setFilter(myFilter); 
grid.setDataProvider(dataProvider); 
+0

Merci. J'ai résolu le problème avec votre poste en combinaison avec https://vaadin.com/docs/v8/framework/datamodel/datamodel-providers.html#lazy-filtering. – Fabian

+0

Mon code provient d'un système générique et je ne voulais pas le simplifier pour DAO, alors peut-être que quelqu'un le trouvera plus utile :) – avix