GeneticAnnotationFilter.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.List;

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

import org.gringlobal.model.GeneticAnnotation;
import org.gringlobal.model.QGeneticAnnotation;

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

import com.querydsl.core.types.Predicate;

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

	private static final long serialVersionUID = -7840555493439868769L;

	/** The genetic marker filter. */
	public GeneticMarkerFilter geneticMarker;

	/** The method filter. */
	public MethodFilter method;

	/** The assay method. */
	public StringFilter assayMethod;

	/** The scoring method. */
	public StringFilter scoringMethod;

	/** The size alleles. */
	public StringFilter sizeAlleles;

	/** The unusual alleles. */
	public StringFilter unusualAlleles;

	/** The maximum number of GOB alleles. */
	public NumberFilter<Integer> maxGobAlleles;

	/** The observation alleles count. */
	public NumberFilter<Integer> observationAllelesCount;

	@Override
	public List<Predicate> collectPredicates() {
		return collectPredicates(QGeneticAnnotation.geneticAnnotation);
	}

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

		if (geneticMarker != null) {
			predicates.add(geneticMarker.nestedPredicate(geneticAnnotation.geneticMarker()));
		}
		if (method != null) {
			predicates.add(method.nestedPredicate(geneticAnnotation.method()));
		}
		if (assayMethod != null) {
			predicates.add(assayMethod.buildQuery(geneticAnnotation.assayMethod));
		}
		if (scoringMethod != null) {
			predicates.add(scoringMethod.buildQuery(geneticAnnotation.scoringMethod));
		}
		if (sizeAlleles != null) {
			predicates.add(sizeAlleles.buildQuery(geneticAnnotation.sizeAlleles));
		}
		if (unusualAlleles != null) {
			predicates.add(unusualAlleles.buildQuery(geneticAnnotation.unusualAlleles));
		}
		if (maxGobAlleles != null) {
			predicates.add(maxGobAlleles.buildQuery(geneticAnnotation.maxGobAlleles));
		}
		if (observationAllelesCount != null) {
			predicates.add(observationAllelesCount.buildQuery(geneticAnnotation.observationAllelesCount));
		}

		return predicates;
	}

	public synchronized GeneticMarkerFilter geneticMarker() {
		return geneticMarker == null ? geneticMarker = new GeneticMarkerFilter() : this.geneticMarker;
	}

	public synchronized MethodFilter method() {
		return method == null ? method = new MethodFilter() : this.method;
	}

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

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

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

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

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

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