All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.springframework.data.jpa.datatables.PredicateBuilder Maven / Gradle / Ivy

Go to download

Spring Data JPA extension to work with the great jQuery plug-in DataTables (http://datatables.net/)

There is a newer version: 7.0.1
Show newest version
package org.springframework.data.jpa.datatables;

import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.Predicate;
import com.querydsl.core.types.dsl.PathBuilder;
import org.springframework.data.jpa.datatables.mapping.DataTablesInput;

import java.util.ArrayList;
import java.util.List;

public class PredicateBuilder extends AbstractPredicateBuilder {
    private final PathBuilder entity;
    private List columnPredicates = new ArrayList<>();
    private List globalPredicates = new ArrayList<>();

    public PredicateBuilder(PathBuilder entity, DataTablesInput input) {
        super(input);
        this.entity = entity;
    }

    @Override
    public Predicate build() {
        initPredicatesRecursively(tree, entity);

        if (input.getSearchPanes() != null) {
            input.getSearchPanes().forEach((attribute, values) -> {
                if (!values.isEmpty()) {
                    columnPredicates.add(entity.get(attribute).in(values));
                }
            });
        }

        return createFinalPredicate();
    }

    private void initPredicatesRecursively(Node node, PathBuilder pathBuilder) {
        if (node.isLeaf()) {
            boolean hasColumnFilter = node.getData() != null;
            if (hasColumnFilter) {
                Filter columnFilter = node.getData();
                columnPredicates.add(columnFilter.createPredicate(pathBuilder, node.getName()));
            } else if (hasGlobalFilter) {
                Filter globalFilter = tree.getData();
                globalPredicates.add(globalFilter.createPredicate(pathBuilder, node.getName()));
            }
        }
        for (Node child : node.getChildren()) {
            initPredicatesRecursively(child, child.isLeaf() ? pathBuilder : pathBuilder.get(child.getName()));
        }
    }

    private Predicate createFinalPredicate() {
        BooleanBuilder predicate = new BooleanBuilder();

        for (Predicate columnPredicate : columnPredicates) {
            predicate = predicate.and(columnPredicate);
        }

        if (!globalPredicates.isEmpty()) {
            predicate = predicate.andAnyOf(globalPredicates.toArray(new Predicate[0]));
        }

        return predicate;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy