io.evitadb.api.requestResponse.extraResult.Histogram Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of evita_api Show documentation
Show all versions of evita_api Show documentation
Module contains external API of the evitaDB.
/*
*
* _ _ ____ ____
* _____ _(_) |_ __ _| _ \| __ )
* / _ \ \ / / | __/ _` | | | | _ \
* | __/\ V /| | || (_| | |_| | |_) |
* \___| \_/ |_|\__\__,_|____/|____/
*
* Copyright (c) 2023
*
* Licensed under the Business Source License, Version 1.1 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://github.com/FgForrest/evitaDB/blob/master/LICENSE
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.evitadb.api.requestResponse.extraResult;
import io.evitadb.utils.ArrayUtils;
import io.evitadb.utils.Assert;
import io.evitadb.utils.MemoryMeasuringConstants;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import javax.annotation.Nonnull;
import java.io.Serial;
import java.math.BigDecimal;
import java.util.Arrays;
/**
* Default implementation of {@link HistogramContract}
*
* @see HistogramContract
* @author Jan Novotný ([email protected]), FG Forrest a.s. (c) 2021
*/
@EqualsAndHashCode
public class Histogram implements HistogramContract {
@Serial private static final long serialVersionUID = 7702878167079284412L;
private final BigDecimal max;
@Getter private final Bucket[] buckets;
public Histogram(@Nonnull Bucket[] buckets, @Nonnull BigDecimal max) {
Assert.isTrue(!ArrayUtils.isEmpty(buckets), "Buckets may never be empty!");
Assert.isTrue(buckets[buckets.length - 1].threshold().compareTo(max) <= 0, "Last bucket must have threshold lower than max!");
Bucket lastBucket = null;
for (Bucket bucket : buckets) {
Assert.isTrue(
lastBucket == null || lastBucket.threshold().compareTo(bucket.threshold()) < 0,
"Buckets must have monotonic row of thresholds!"
);
lastBucket = bucket;
}
this.buckets = buckets;
this.max = max;
}
@Override
public int estimateSize() {
return MemoryMeasuringConstants.OBJECT_HEADER_SIZE +
MemoryMeasuringConstants.BIG_DECIMAL_SIZE +
buckets.length * Bucket.BUCKET_MEMORY_SIZE;
}
@Nonnull
@Override
public BigDecimal getMin() {
return buckets[0].threshold();
}
@Nonnull
@Override
public BigDecimal getMax() {
return max;
}
@Override
public int getOverallCount() {
return Arrays.stream(buckets).mapToInt(Bucket::occurrences).sum();
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < buckets.length; i++) {
final Bucket bucket = buckets[i];
final boolean hasNext = i + 1 < buckets.length;
sb.append("[")
.append(bucket.threshold())
.append(" - ")
.append(hasNext ? buckets[i + 1].threshold() : max)
.append("]: ")
.append(bucket.occurrences());
if (hasNext) {
sb.append(", ");
}
}
return sb.toString();
}
}