GeneticObservationFilter.java

/*
 * Copyright 2026 Global Crop Diversity Trust
 * Licensed under the Apache License, Version 2.0
 * See LICENSE file in project root folder or http://www.apache.org/licenses/LICENSE-2.0
 */

package org.gringlobal.service.filter;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.genesys.blocks.model.filters.NumberFilter;
import org.genesys.blocks.model.filters.StringFilter;

import org.gringlobal.model.GeneticObservation;
import org.gringlobal.model.QGeneticObservation;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import com.querydsl.core.types.Predicate;
import org.apache.commons.collections4.CollectionUtils;

/**
 * Filters for {@link GeneticObservation}
 */
@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
@Accessors(fluent = true)
public class GeneticObservationFilter extends CooperatorOwnedModelFilter<GeneticObservationFilter, GeneticObservation, QGeneticObservation> {

	private static final long serialVersionUID = -6740760232177787927L;

	/** The inventory filter. */
	public InventoryFilter inventory;

	/** The genetic annotation filter. */
	public GeneticAnnotationFilter geneticAnnotation;

	/** The data quality code. */
	public Set<String> dataQualityCode;

	/** Archived flag. */
	public Boolean isArchived;

	/** The value. */
	public StringFilter value;

	/** The frequency. */
	public NumberFilter<Double> frequency;

	/** The maximum value. */
	public NumberFilter<Double> maximumValue;

	/** The mean value. */
	public NumberFilter<Double> meanValue;

	/** The minimum value. */
	public NumberFilter<Double> minimumValue;

	/** The standard deviation. */
	public NumberFilter<Double> standardDeviation;

	/** The rank. */
	public NumberFilter<Integer> rank;

	/** The sample size. */
	public NumberFilter<Integer> sampleSize;

	@Override
	public List<Predicate> collectPredicates() {
		return collectPredicates(QGeneticObservation.geneticObservation);
	}

	public List<Predicate> collectPredicates(QGeneticObservation geneticObservation) {
		final List<Predicate> predicates = super.collectSuperPredicates(geneticObservation, geneticObservation._super);

		if (inventory != null) {
			predicates.add(inventory.nestedPredicate(geneticObservation.inventory()));
		}
		if (geneticAnnotation != null) {
			predicates.add(geneticAnnotation.nestedPredicate(geneticObservation.geneticAnnotation()));
		}
		if (CollectionUtils.isNotEmpty(dataQualityCode)) {
			predicates.add(geneticObservation.dataQualityCode.in(dataQualityCode));
		}
		if (isArchived != null) {
			predicates.add(geneticObservation.isArchived.eq(convertToString(isArchived)));
		}
		if (value != null) {
			predicates.add(value.buildQuery(geneticObservation.value));
		}
		if (frequency != null) {
			predicates.add(frequency.buildQuery(geneticObservation.frequency));
		}
		if (maximumValue != null) {
			predicates.add(maximumValue.buildQuery(geneticObservation.maximumValue));
		}
		if (meanValue != null) {
			predicates.add(meanValue.buildQuery(geneticObservation.meanValue));
		}
		if (minimumValue != null) {
			predicates.add(minimumValue.buildQuery(geneticObservation.minimumValue));
		}
		if (standardDeviation != null) {
			predicates.add(standardDeviation.buildQuery(geneticObservation.standardDeviation));
		}
		if (rank != null) {
			predicates.add(rank.buildQuery(geneticObservation.rank));
		}
		if (sampleSize != null) {
			predicates.add(sampleSize.buildQuery(geneticObservation.sampleSize));
		}

		return predicates;
	}

	public synchronized InventoryFilter inventory() {
		return inventory == null ? inventory = new InventoryFilter() : this.inventory;
	}

	public synchronized GeneticAnnotationFilter geneticAnnotation() {
		return geneticAnnotation == null ? geneticAnnotation = new GeneticAnnotationFilter() : this.geneticAnnotation;
	}

	public synchronized Set<String> dataQualityCode() {
		return dataQualityCode == null ? dataQualityCode = new HashSet<>() : this.dataQualityCode;
	}

	public synchronized StringFilter value() {
		return value == null ? value = new StringFilter() : this.value;
	}

	public synchronized NumberFilter<Double> frequency() {
		return frequency == null ? frequency = new NumberFilter<>() : this.frequency;
	}

	public synchronized NumberFilter<Double> maximumValue() {
		return maximumValue == null ? maximumValue = new NumberFilter<>() : this.maximumValue;
	}

	public synchronized NumberFilter<Double> meanValue() {
		return meanValue == null ? meanValue = new NumberFilter<>() : this.meanValue;
	}

	public synchronized NumberFilter<Double> minimumValue() {
		return minimumValue == null ? minimumValue = new NumberFilter<>() : this.minimumValue;
	}

	public synchronized NumberFilter<Double> standardDeviation() {
		return standardDeviation == null ? standardDeviation = new NumberFilter<>() : this.standardDeviation;
	}

	public synchronized NumberFilter<Integer> rank() {
		return rank == null ? rank = new NumberFilter<>() : this.rank;
	}

	public synchronized NumberFilter<Integer> sampleSize() {
		return sampleSize == null ? sampleSize = new NumberFilter<>() : this.sampleSize;
	}
}