package de.ph87.data.topic.query; import de.ph87.data.series.Series; import jakarta.annotation.Nullable; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; import jakarta.persistence.ManyToOne; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.NonNull; import lombok.ToString; @Getter @ToString @Embeddable @NoArgsConstructor public class TopicQuery { @Nullable @ManyToOne private Series series; @NonNull @Column(nullable = false) private String valueQuery = ""; @NonNull @Column(nullable = false) private String beginQuery = ""; @NonNull @Column(nullable = false) private String terminatedQuery = ""; @NonNull @Column(nullable = false) @Enumerated(EnumType.STRING) private TopicQuery.Function function = Function.NONE; @Column(nullable = false) private double factor; public TopicQuery( @Nullable final Series series, @NonNull final String valueQuery ) { this(series, valueQuery, "", ""); } public TopicQuery( @Nullable final Series series, @NonNull final String valueQuery, final double factor ) { this(series, valueQuery, factor, Function.NONE, "", ""); } public TopicQuery( @Nullable final Series series, @NonNull final String valueQuery, final double factor, @NonNull final TopicQuery.Function function ) { this(series, valueQuery, factor, function, "", ""); } public TopicQuery( @Nullable final Series series, @NonNull final String valueQuery, @NonNull final String beginQuery, @NonNull final String terminatedQuery ) { this(series, valueQuery, 1, Function.NONE, beginQuery, terminatedQuery); } public TopicQuery( @Nullable final Series series, @NonNull final String valueQuery, final double factor, @NonNull final TopicQuery.Function function, @NonNull final String beginQuery, @NonNull final String terminatedQuery ) { this.series = series; this.valueQuery = valueQuery; this.beginQuery = beginQuery; this.terminatedQuery = terminatedQuery; this.function = function; this.factor = factor; } public enum Function { NONE(v -> v), ONLY_POSITIVE(v -> v > 0 ? v : 0), ONLY_NEGATIVE_BUT_NEGATE(v -> v < 0 ? -v : 0), ; private final java.util.function.Function function; Function(@NonNull java.util.function.Function function) { this.function = function; } public double apply(final double value) { return function.apply(value); } } }