1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 package org.spf4j.perf.impl;
33
34 import java.io.Serializable;
35 import javax.annotation.Nonnull;
36 import javax.annotation.concurrent.Immutable;
37
38
39
40
41 @Immutable
42 public final class Quanta implements Comparable<Quanta>, Serializable {
43
44 private static final long serialVersionUID = 1L;
45
46 private final long intervalStart;
47 private final long intervalEnd;
48
49 public Quanta(final long intervalStart, final long intervalEnd) {
50 this.intervalStart = intervalStart;
51 this.intervalEnd = intervalEnd;
52 }
53
54 public Quanta(@Nonnull final String stringVariant) {
55 int undLocation = stringVariant.indexOf('_');
56 if (undLocation < 0) {
57 throw new IllegalArgumentException("Invalid Quanta DataSource " + stringVariant);
58 }
59 String startStr = stringVariant.substring(1, undLocation);
60 String endStr = stringVariant.substring(undLocation + 1);
61 if ("NI".equals(startStr)) {
62 this.intervalStart = Long.MIN_VALUE;
63 } else {
64 this.intervalStart = Long.parseLong(startStr);
65 }
66 if ("PI".equals(endStr)) {
67 this.intervalEnd = Long.MAX_VALUE;
68 } else {
69 this.intervalEnd = Long.parseLong(endStr);
70 }
71 }
72
73 public long getIntervalEnd() {
74 return intervalEnd;
75 }
76
77 public long getIntervalStart() {
78 return intervalStart;
79 }
80
81 public long getClosestToZero() {
82 return (intervalStart < 0) ? intervalEnd : intervalStart;
83 }
84
85 @Override
86 public String toString() {
87 StringBuilder result = new StringBuilder(16);
88 result.append('Q');
89 if (intervalStart == Long.MIN_VALUE) {
90 result.append("NI");
91 } else {
92 result.append(intervalStart);
93 }
94 result.append('_');
95 if (intervalEnd == Long.MAX_VALUE) {
96 result.append("PI");
97 } else {
98 result.append(intervalEnd);
99 }
100 return result.toString();
101 }
102
103 @Override
104 public int compareTo(final Quanta o) {
105 if (this.intervalStart < o.intervalStart) {
106 return -1;
107 } else if (this.intervalStart > o.intervalStart) {
108 return 1;
109 } else {
110 if (this.intervalEnd < o.intervalEnd) {
111 return -1;
112 } else if (this.intervalEnd > o.intervalEnd) {
113 return 1;
114 } else {
115 return 0;
116 }
117 }
118 }
119
120 @Override
121 public int hashCode() {
122 int hash = 7;
123 hash = 89 * hash + (int) (this.intervalStart ^ (this.intervalStart >>> 32));
124 return 89 * hash + (int) (this.intervalEnd ^ (this.intervalEnd >>> 32));
125 }
126
127 @Override
128 public boolean equals(final Object obj) {
129 if (obj == null) {
130 return false;
131 }
132 if (getClass() != obj.getClass()) {
133 return false;
134 }
135 final Quanta other = (Quanta) obj;
136 return this.compareTo(other) == 0;
137 }
138
139 }