UsersSearchSpecificationService.java

package es.um.atica.faker.users.application.service;

import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public interface UsersSearchSpecificationService {

    // Multiple Search String
    // search=fieldA>2|fieldB<4,fieldC:3
    // ==> (fieldA > 2 or fieldB < 4) and fieldC = 3

    public Object defaultSpec();
    public Object buildAndSpec(Object element1, Object element2);
    public Object buildOrSpec(Object element1, Object element2);
    public Object buildSpecFor(String el1, String op, String el2);

    default Object genericSpec(String s) {
        // Parse pattern for individual spec
        Pattern p = Pattern.compile("(.+)([\\>\\<\\~\\:])(.+)");
        Matcher m = p.matcher(s);
        if (m.find()) {
            return buildSpecFor(m.group(1),m.group(2),m.group(3));
        } else {
            return defaultSpec();
        }
    }

    default Object buildIndividualSpec(String search) {
        return Arrays.stream(search.split("\\|"))
            .map(f -> genericSpec(f))
            .reduce((subtotal,element)->buildOrSpec(element, subtotal))
            .get();
    }

    default Object buildSpecificationFromSearch(List<String> search) {
        return search.stream()
            .map(s->buildIndividualSpec(s))
            .reduce((subtotal,element)-> buildAndSpec(element,subtotal))
            .get();
    }

}