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

ca.gc.aafc.dina.repository.ReadOnlyDinaRepositoryV2 Maven / Gradle / Ivy

There is a newer version: 0.138
Show newest version
package ca.gc.aafc.dina.repository;

import java.util.List;
import java.util.function.Predicate;

import ca.gc.aafc.dina.filter.FilterComponent;
import ca.gc.aafc.dina.filter.FilterExpression;
import ca.gc.aafc.dina.filter.FilterGroup;
import ca.gc.aafc.dina.filter.QueryComponent;
import ca.gc.aafc.dina.filter.QueryStringParser;
import ca.gc.aafc.dina.filter.SimpleObjectFilterHandlerV2;
import ca.gc.aafc.dina.service.PredicateBasedReadOnlyDinaService;

/**
 * Based repository for accessing read-only data.
 */
public class ReadOnlyDinaRepositoryV2 {

  private final PredicateBasedReadOnlyDinaService service;

  public ReadOnlyDinaRepositoryV2(PredicateBasedReadOnlyDinaService service) {
    this.service = service;
  }

  public D findOne(K key) {
    return service.findOne(key);
  }

  public List findAll(String queryString) {
    QueryComponent queryComponents = QueryStringParser.parse(queryString);

    FilterComponent fc = queryComponents.getFilters();

    Predicate predicate = handlePredicate(fc);
    return service.findAll(predicate, queryComponents.getPageOffset(), queryComponents.getPageLimit());
  }

  private Predicate handlePredicate(FilterComponent fc) {
    Predicate predicate = null;
    if (fc instanceof FilterExpression fex) {
      predicate = and(predicate, SimpleObjectFilterHandlerV2.buildPredicate(fex));
    } else if( fc instanceof FilterGroup fgrp) {
      // multiple values can be submitted with en EQUALS to create an OR.
      if (fgrp.getConjunction() == FilterGroup.Conjunction.OR) {
        predicate = handleOr(fgrp.getComponents());
      } else {
        predicate = handleAnd(fgrp.getComponents());
      }
    }
    return predicate;
  }

  private Predicate handleOr(List orList) {
    Predicate predicate = null;
    for (FilterComponent fc : orList) {
      if (fc instanceof FilterExpression fex) {
        predicate = or(predicate, SimpleObjectFilterHandlerV2.buildPredicate(fex));
      } else if (fc instanceof FilterGroup fg) {
        predicate = or(predicate, handlePredicate(fg));
      }
    }
    return predicate;
  }

  private Predicate handleAnd(List andList) {
    Predicate predicate = null;
    for (FilterComponent fc : andList) {
      if (fc instanceof FilterExpression fex) {
        predicate = and(predicate, SimpleObjectFilterHandlerV2.buildPredicate(fex));
      } else if (fc instanceof FilterGroup fg) {
        predicate = and(predicate, handlePredicate(fg));
      }
    }
    return predicate;
  }

  private Predicate and(Predicate current, Predicate toAdd) {
    if( current == null) {
      return toAdd;
    }
    return current.and(toAdd);
  }

  private Predicate or(Predicate current, Predicate toAdd) {
    if( current == null) {
      return toAdd;
    }
    return current.or(toAdd);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy