diff options
Diffstat (limited to 'simplemetrics/src/main/java/com/yahoo/metrics/simple/Point.java')
-rw-r--r-- | simplemetrics/src/main/java/com/yahoo/metrics/simple/Point.java | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/simplemetrics/src/main/java/com/yahoo/metrics/simple/Point.java b/simplemetrics/src/main/java/com/yahoo/metrics/simple/Point.java new file mode 100644 index 00000000000..61415f042bc --- /dev/null +++ b/simplemetrics/src/main/java/com/yahoo/metrics/simple/Point.java @@ -0,0 +1,126 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.metrics.simple; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import com.google.common.annotations.Beta; +import com.google.common.collect.ImmutableList; +import com.yahoo.collections.Tuple2; +import com.yahoo.jdisc.Metric.Context; + +/** + * An efficiently comparable point in a sparse vector space. + * + * @author steinar + */ +@Beta +public final class Point implements Context { + private final Value[] location; + private final String[] dimensions; + + public Point(Map<String, ?> properties) { + this(buildParameters(properties)); + } + + private Point(Tuple2<String[], Value[]> dimensionsAndLocation) { + this(dimensionsAndLocation.first, dimensionsAndLocation.second); + } + + /** + * Only to be used by simplemetrics itself. + * + * @param dimensions dimension name, Point takes ownership of the array + * @param location dimension values, Point takes ownership of the array + */ + Point(String[] dimensions, Value[] location) { + this.dimensions = dimensions; + this.location = location; + } + + private static Tuple2<String[], Value[]> buildParameters(Map<String, ?> properties) { + String[] dimensions = properties.keySet().toArray(new String[0]); + Arrays.sort(dimensions); + Value[] location = new Value[dimensions.length]; + for (int i = 0; i < dimensions.length; ++i) { + location[i] = Value.of(String.valueOf(properties.get(dimensions[i]))); + } + return new Tuple2<>(dimensions, location); + + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Point other = (Point) obj; + if (!Arrays.equals(dimensions, other.dimensions)) { + return false; + } + if (!Arrays.equals(location, other.location)) { + return false; + } + return true; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + Arrays.hashCode(dimensions); + result = prime * result + Arrays.hashCode(location); + return result; + } + + @Override + public String toString() { + final int maxLen = 3; + StringBuilder builder = new StringBuilder(); + builder.append("Point [location=") + .append(Arrays.asList(location).subList(0, Math.min(location.length, maxLen))) + .append(", dimensions=") + .append(Arrays.asList(dimensions).subList(0, Math.min(dimensions.length, maxLen))) + .append("]"); + return builder.toString(); + } + + /** + * Get an immutable list view of the values for each dimension. + */ + public List<Value> location() { + return ImmutableList.copyOf(location); + } + + /** + * Get an immutable list view of the names of each dimension. + */ + public List<String> dimensions() { + return ImmutableList.copyOf(dimensions); + } + + /** + * Get the number of dimensions defined for this Point, i.e. the size of the + * collection returned by {@link #dimensions()}. + */ + public int dimensionality() { + return dimensions.length; + } + + /** package private accessor only for simplemetrics itself */ + String[] getDimensions() { + return dimensions; + } + + /** package private accessor only for simplemetrics itself */ + Value[] getLocation() { + return location; + } +} |