Custom Filtering with Selectonemenu
achittela Oct 15, 2013 3:34 PMI am trying to filter the data table based on the values selected in the selectbox. I have around 10000 records in datatable, to make rendering faster I am using SerializableDataModel and i implemented logic in walk() method and Modify() method.
I am able to filter the data table with the text box values but, i am not able to use the select box filter in this scenario. How can i get column name of the select box and the selected value and it to the filterMap in the modify method ?
I tried filter expression but, it's not working in this scenario.
Walk() method:
    @Override
    public void walk(FacesContext context, DataVisitor visitor, Range range,
                     Object argument) throws IOException {
        // This is method we have to populate a data for DataTable
        // Range parameter provides the firstRow value and no. of rows value
        this.firstRow = ((SequenceRange) range).getFirstRow();
        this.numberOfRows = ((SequenceRange) range).getRows();
        List<CustomerList> cList = getCustomerList(this.firstRow,
                this.numberOfRows.intValue(), this.sortField, this.ascending);
        System.out.println("customerList in walk method:" + cList.size());
        this.totalRows = new Integer(displayCustomerListOne.size());
        System.out.println("displayCustomerListOne.size" + this.totalRows);
        wrappedKeys = new ArrayList<Integer>();
        if (!cList.isEmpty()) {
            for (CustomerList item : cList) {
                System.out.println("item.getAvIdPk()" + item.getAvIdPk());
                wrappedKeys.add(item.getAvIdPk());
                wrappedData.put(item.getAvIdPk(), item);
                // Once data populated to wrappedKeys and wrappedData call the
                // process method using visitor parameter
                visitor.process(context, item.getAvIdPk(), argument);
            }
        }
    }
Modify() method:
    @Override
    public void modify(List<FilterField> filterFields,
                       List<SortField2> sortFields) {
        filterMap.clear();
        String expressionStr = null;
        ExtendedFilterField extendedFilterField = null;
        String value = null;
        Expression filterExpression = null;
        if (null != sortFields && !sortFields.isEmpty()) {
            SortField2 sortField2 = sortFields.get(0);
            Expression sortExpression = sortField2.getExpression();
            String expressionString = sortExpression.getExpressionString();
            if (!sortExpression.isLiteralText()) {
                expressionString = expressionString.replaceAll(
                        "[#|$]{1}\\{.*?\\.", "").replaceAll("\\}", "");
            }
            this.sortField = expressionString;
            if (sortField2.getOrdering() == Ordering.ASCENDING) {
                this.ascending = true;
            } else if (sortField2.getOrdering() == Ordering.DESCENDING) {
                this.ascending = false;
            }
        }
        if (filterFields != null && !filterFields.isEmpty()) {
            for (FilterField filterField : filterFields) {
                if (filterField instanceof ExtendedFilterField) {
                    extendedFilterField = (ExtendedFilterField) filterField;
                    value = extendedFilterField.getFilterValue();
                    if (value != null && !value.equals("")) {
                        filterExpression = extendedFilterField.getExpression();
                        System.out.println("filterExpression "+filterExpression);
                        expressionStr = filterExpression.getExpressionString();
                        if (!filterExpression.isLiteralText()) {
                            expressionStr = expressionStr.replaceAll(
                                    "[#|$]{1}\\{.*?\\.", "").replaceAll("\\}",
                                    "");
                        }
                        filterMap.put(expressionStr, value);
                    }
                }
            }
        }
    }
Below is my JSP code:
<rich:dataTable value="#{item}" var="dataTableItem"
  rowClasses="oddRow,evenRow"
  footerClass="thclass" id="data"
  onRowClick="dataTable.onRowSubmit(this);" first="#{item.rowIndex}"
  rows="20" reRender="pg" sortMode="single">
  <rich:column sortable="false" id="col_1">
  <f:facet name="header">
  <h:panelGroup>
  <h:outputText />
  <br />
  <h:outputText />
  </h:panelGroup>
  </f:facet>
  <h:commandButton style="display: none;"
  action="#{item.customerDetail}">
  <f:param name="selectedAvId" value="#{dataTableItem.avId}" />
  </h:commandButton>
  <h:graphicImage value="images/icoEdit15.gif" style="border:none"
  alt="Edit"></h:graphicImage>
  </rich:column>
  <rich:column sortable="true" headerClass="standardTable_Header"
  sortBy="#{dataTableItem.changeTypeStatus}" id="col_2">
  <f:facet name="header">
  <h:panelGroup>
  <h:outputText value="#{msgs.changeTypeStatus} " id="cl2" /><br>                      
  <h:selectOneMenu value="#{item.filterChangeType}">
  <f:selectItem itemValue=""/>
  <f:selectItem itemValue="Enroll"/>
  <f:selectItem itemValue="De-Enroll"/>
  <f:selectItem itemValue="Management Company"/>
  <f:selectItem itemValue="Parent Company"/>
  <f:selectItem itemValue="Name"/>
  <f:selectItem itemValue="Owner"/>
  <f:selectItem itemValue="Brand"/>
  <f:selectItem itemValue="Comment"/>
  <f:selectItem itemValue="Address"/>
  <f:selectItem itemValue="Marketing Rights"/>
  <a4j:support event="onchange" reRender="data , pg" requestDelay="500" ajaxSingle="true"
  ignoreDupResponses="true"/>
  </h:selectOneMenu>
  </h:panelGroup>
  </f:facet>
  <h:outputText id="cl_2" value="#{dataTableItem.changeTypeStatus}" />
  </rich:column>
  <rich:column sortable="true"
  filterBy="#{dataTableItem.brandMandated}" filterEvent="onkeyup"
  filterValue="#{item.filterValue4}"
  sortBy="#{dataTableItem.brandMandated}" id="col_4">
  <f:facet name="header">
  <h:outputText value="#{msgs.brandmandated}" id="cl4" />
  </f:facet>
  <h:outputText style="white-space:nowrap;"
  value="#{dataTableItem.brandMandated}" id="cl_4" />
  </rich:column>
<rich:column sortable="true" sortBy="#{dataTableItem.city}"
  filterBy="#{dataTableItem.city}" filterEvent="onkeyup"
  filterValue="#{item.filterValue11}" id="col_11">
  <f:facet name="header">
  <h:outputText value="#{msgs.city}" id="cl11" />
  </f:facet>
  <h:outputText value="#{dataTableItem.city}" id="cl_11" />
  </rich:column>
  <rich:column sortable="true" sortBy="#{dataTableItem.state}"
  filterBy="#{dataTableItem.state}" filterEvent="onkeyup"
  filterValue="#{item.filterValue12}" id="col_12">
  <f:facet name="header">
  <h:outputText value="#{msgs.state}" id="cl12" />
  </f:facet>
  <h:outputText value="#{dataTableItem.state}" id="cl_12" />
  </rich:column>
  <rich:datascroller id="pg" renderIfSinglePage="false" maxPages="5" for="data" />
</rich:dataTable>
 
    