• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

knowledgepixels / nanodash / 33635029536

02 Sep 2026 01:19PM UTC coverage: 41.309% (+0.2%) from 41.108%
33635029536

push

github

web-flow
Merge pull request #675 from knowledgepixels/fix/673-table-ordering

fix(view tables): make ordering by a column visible and correct

3804 of 9947 branches covered (38.24%)

Branch coverage included in aggregate %.

6943 of 16069 relevant lines covered (43.21%)

6.86 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
src/main/java/com/knowledgepixels/nanodash/FilteredQueryResultDataProvider.java
1
package com.knowledgepixels.nanodash;
2

3
import org.apache.wicket.extensions.markup.html.repeater.data.sort.ISortState;
4
import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
5
import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
6
import org.apache.wicket.model.IModel;
7
import org.nanopub.extra.services.ApiResponse;
8
import org.nanopub.extra.services.ApiResponseEntry;
9

10
import java.util.ArrayList;
11
import java.util.Arrays;
12
import java.util.Iterator;
13
import java.util.List;
14

15
/**
16
 * Filtered data provider that wraps QueryResultDataProvider and filters results based on a filter string.
17
 */
18
public class FilteredQueryResultDataProvider implements ISortableDataProvider<ApiResponseEntry, String> {
19

20
    private final QueryResultDataProvider baseProvider;
21
    private final ApiResponse response;
22
    private String filterText = "";
×
23
    private List<ApiResponseEntry> filteredData = null;
×
24

25
    public FilteredQueryResultDataProvider(QueryResultDataProvider baseProvider, ApiResponse response) {
×
26
        this.baseProvider = baseProvider;
×
27
        this.response = response;
×
28
    }
×
29

30
    public void setFilterText(String filterText) {
31
        if (filterText == null) {
×
32
            filterText = "";
×
33
        }
34
        if (!this.filterText.equals(filterText)) {
×
35
            this.filterText = filterText;
×
36
            this.filteredData = null; // Invalidate cache
×
37
        }
38
    }
×
39

40
    public List<ApiResponseEntry> getFilteredData() {
41
        if (filteredData != null) {
×
42
            return filteredData;
×
43
        }
44

45
        List<ApiResponseEntry> allData = response.getData();
×
46
        if (filterText == null || filterText.trim().isEmpty()) {
×
47
            filteredData = allData;
×
48
        } else {
49
            String lowerFilter = filterText.toLowerCase();
×
50
            filteredData = new ArrayList<>();
×
51
            for (ApiResponseEntry entry : allData) {
×
52
                boolean matches = false;
×
53
                for (String key : response.getHeader()) {
×
54
                    String value = entry.get(key);
×
55
                    if (value != null && value.toLowerCase().contains(lowerFilter)) {
×
56
                        matches = true;
×
57
                        break;
×
58
                    }
59
                }
60
                if (matches) {
×
61
                    filteredData.add(entry);
×
62
                }
63
            }
×
64
        }
65
        return filteredData;
×
66
    }
67

68
    @Override
69
    public Iterator<? extends ApiResponseEntry> iterator(long first, long count) {
70
        List<ApiResponseEntry> data = new ArrayList<>(getFilteredData());
×
71
        SortParam<String> sortParam = baseProvider.getSortParam();
×
72
        if (sortParam != null) {
×
73
            String prop = sortParam.getProperty();
×
74
            String labelProp = prop + "_label";
×
75
            String sortProp = Arrays.asList(response.getHeader()).contains(labelProp) ? labelProp : prop;
×
76
            // Values are compared with Utils.compareValues rather than as plain text, so
77
            // that a column of numbers does not come out with "10" above "9" (issue #673).
78
            data.sort((o1, o2) -> {
×
79
                String v1 = o1.get(sortProp);
×
80
                String v2 = o2.get(sortProp);
×
81
                int result;
82
                if (v1 == null && v2 == null) result = 0;
×
83
                else if (v1 == null) result = 1;
×
84
                else if (v2 == null) result = -1;
×
85
                else result = Utils.compareValues(v1, v2);
×
86
                if (!sortParam.isAscending()) result = -result;
×
87
                return result;
×
88
            });
89
        }
90
        return Utils.subList(data, first, first + count).iterator();
×
91
    }
92

93
    @Override
94
    public IModel<ApiResponseEntry> model(ApiResponseEntry object) {
95
        return baseProvider.model(object);
×
96
    }
97

98
    @Override
99
    public long size() {
100
        return getFilteredData().size();
×
101
    }
102

103
    @Override
104
    public ISortState<String> getSortState() {
105
        return baseProvider.getSortState();
×
106
    }
107

108
    @Override
109
    public void detach() {
110
        baseProvider.detach();
×
111
    }
×
112

113
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc