aboutsummaryrefslogtreecommitdiffstats
path: root/container-core/src/main/java/com/yahoo/metrics/simple/Point.java
diff options
context:
space:
mode:
authorgjoranv <gv@verizonmedia.com>2021-04-13 17:03:46 +0200
committergjoranv <gv@verizonmedia.com>2021-04-13 17:03:46 +0200
commit3f46e126abf3da75ae561ff9f5070b977b3004e3 (patch)
tree581403a84038d1299edf14d5ed54aeae0541d5cc /container-core/src/main/java/com/yahoo/metrics/simple/Point.java
parent94611f2c72d033a15b251b59781ff7dddfef63fe (diff)
Add java source from simplemetrics.
Diffstat (limited to 'container-core/src/main/java/com/yahoo/metrics/simple/Point.java')
-rw-r--r--container-core/src/main/java/com/yahoo/metrics/simple/Point.java133
1 files changed, 133 insertions, 0 deletions
diff --git a/container-core/src/main/java/com/yahoo/metrics/simple/Point.java b/container-core/src/main/java/com/yahoo/metrics/simple/Point.java
new file mode 100644
index 00000000000..672d05c1874
--- /dev/null
+++ b/container-core/src/main/java/com/yahoo/metrics/simple/Point.java
@@ -0,0 +1,133 @@
+// Copyright 2017 Yahoo Holdings. 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 final Point theEmptyPoint = new Point(new String[0], new Value[0]);
+
+ /** the canonical 0-dimensional Point. */
+ public static Point emptyPoint() { return theEmptyPoint; }
+
+ 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;
+ }
+
+}