1e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin/*
2e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * Copyright (C) 2012 Google Inc.
3e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin *
4e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
5e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * you may not use this file except in compliance with the License.
6e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * You may obtain a copy of the License at
7e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin *
8e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
9e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin *
10e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * Unless required by applicable law or agreed to in writing, software
11e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
12e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * See the License for the specific language governing permissions and
14e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * limitations under the License.
15e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin */
16e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
17e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinpackage com.google.caliper.model;
18e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
19e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport static com.google.common.base.Preconditions.checkArgument;
20e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport static com.google.common.base.Preconditions.checkNotNull;
21e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
22e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.common.base.Function;
23e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.common.base.MoreObjects;
24e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.common.base.Objects;
25e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.common.collect.ImmutableListMultimap;
26e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.common.collect.Multimaps;
27e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
28e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport java.io.Serializable;
29e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
30e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin/**
31e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * A single, weighted measurement.
32e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin *
33e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * @author gak@google.com (Gregory Kick)
34e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin */
35e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinpublic class Measurement implements Serializable {
36e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  private static final long serialVersionUID = 1L;
37e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
38e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  public static ImmutableListMultimap<String, Measurement> indexByDescription(
39e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      Iterable<Measurement> measurements) {
40e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    return Multimaps.index(measurements, new Function<Measurement, String>() {
41e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      @Override public String apply(Measurement input) {
42e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin        return input.description;
43e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      }
44e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    });
45e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  }
46e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
47e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  @ExcludeFromJson
48e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  private int id;
49e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  private Value value;
50e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  private double weight;
51e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  private String description;
52e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
53e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  private Measurement() {
54e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    this.value = Value.DEFAULT;
55e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    this.weight = 0.0;
56e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    this.description = "";
57e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  }
58e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
59e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  private Measurement(Builder builder) {
60e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    this.value = builder.value;
61e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    this.description = builder.description;
62e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    this.weight = builder.weight;
63e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  }
64e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
65e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  @Override public boolean equals(Object obj) {
66e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    if (obj == this) {
67e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      return true;
68e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    } else if (obj instanceof Measurement) {
69e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      Measurement that = (Measurement) obj;
70e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      return this.value.equals(that.value)
71e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin          && this.weight == that.weight
72e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin          && this.description.equals(that.description);
73e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    } else {
74e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      return false;
75e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    }
76e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  }
77e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
78e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  @Override public int hashCode() {
79e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    return Objects.hashCode(value, weight, description);
80e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  }
81e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
82e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  @Override public String toString() {
83e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    return MoreObjects.toStringHelper(this)
84e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin        .add("value", value)
85e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin        .add("weight", weight)
86e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin        .add("description", description)
87e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin        .toString();
88e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  }
89e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
90e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  public Value value() {
91e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    return value;
92e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  }
93e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
94e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  public double weight() {
95e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    return weight;
96e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  }
97e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
98e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  public String description() {
99e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    return description;
100e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  }
101e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
102e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  public static final class Builder {
103e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    private Value value;
104e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    private Double weight;
105e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    private String description;
106e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
107e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    public Builder value(Value value) {
108e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      this.value = checkNotNull(value);
109e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      return this;
110e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    }
111e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
112e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    public Builder weight(double weight) {
113e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      checkArgument(weight > 0);
114e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      this.weight = weight;
115e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      return this;
116e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    }
117e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
118e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    public Builder description(String description) {
119e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      this.description = checkNotNull(description);
120e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      return this;
121e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    }
122e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin
123e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    public Measurement build() {
124e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      checkArgument(value != null);
125e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      checkArgument(weight != null);
126e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      checkArgument(description != null);
127e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin      return new Measurement(this);
128e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin    }
129e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin  }
130e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin}
131