GeoCoordinatesFilter.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 lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.ExpressionUtils;
import com.querydsl.core.types.dsl.NumberPath;

@Getter
@Setter
@Accessors(fluent = true)
public class GeoCoordinatesFilter {

	@JsonValue
	public List<CoordinatesFilter> coordinates;

	@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
	public GeoCoordinatesFilter(List<CoordinatesFilter> coordinates) {
		this.coordinates = coordinates;
	}

	@Getter
	@Setter
	@Accessors(fluent = true)
	public static class CoordinatesFilter {
		public NumberFilter<Double> lat;
		public NumberFilter<Double> lon;
	}

	public BooleanBuilder buildPredicate(NumberPath<Double> latitude, NumberPath<Double> longitude) {
		var coordinatesPredicate = new BooleanBuilder();
		if (coordinates == null) {
			return coordinatesPredicate;
		}
		coordinates.forEach(coord -> {
			if (coord == null) return;
			var a = coord.lat == null || coord.lat.isEmpty() ? null : coord.lat.buildQuery(latitude);
			var b = coord.lon == null || coord.lon.isEmpty() ? null : coord.lon.buildQuery(longitude);
			coordinatesPredicate.or(ExpressionUtils.and(a, b));
		});
		return coordinatesPredicate;
	}
}