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;
}
}