1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.prometheus.maps;
18
19 import io.github.tonywasher.joceanus.oceanus.date.OceanusDate;
20 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
21 import io.github.tonywasher.joceanus.metis.data.MetisDataItem.MetisDataFieldId;
22 import io.github.tonywasher.joceanus.metis.field.MetisFieldItem;
23 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
24 import io.github.tonywasher.joceanus.metis.list.MetisListKey;
25 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataItem;
26 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataResource;
27
28 import java.util.LinkedHashMap;
29 import java.util.Map;
30
31
32
33
34 public class PrometheusMapsDateInstance
35 implements MetisFieldItem {
36
37
38
39 private static final MetisFieldSet<PrometheusMapsDateInstance> FIELD_DEFS
40 = MetisFieldSet.newFieldSet(PrometheusMapsDateInstance.class);
41
42
43
44
45 static {
46 FIELD_DEFS.declareLocalField(PrometheusDataResource.DATAITEM_TYPE, PrometheusMapsDateInstance::getListKey);
47 FIELD_DEFS.declareLocalField(PrometheusMapsResource.MAPS_FIELD, PrometheusMapsDateInstance::getOwnerId);
48 FIELD_DEFS.declareLocalField(PrometheusMapsResource.MAPS_INSTANCEMAP, PrometheusMapsDateInstance::getMap);
49 }
50
51
52
53
54 private final MetisListKey theListKey;
55
56
57
58
59 private final MetisDataFieldId theOwnerId;
60
61
62
63
64 private final MetisDataFieldId theDateId;
65
66
67
68
69 private final Map<PrometheusDataItem, PrometheusMapsFieldInstance> theMap;
70
71
72
73
74 private final boolean allowNull;
75
76
77
78
79
80
81
82
83
84 PrometheusMapsDateInstance(final MetisListKey pListKey,
85 final MetisDataFieldId pOwnerId,
86 final MetisDataFieldId pDateId,
87 final boolean pAllowNull) {
88 theListKey = pListKey;
89 theOwnerId = pOwnerId;
90 theDateId = pDateId;
91 allowNull = pAllowNull;
92 theMap = new LinkedHashMap<>();
93 }
94
95
96
97
98
99
100 PrometheusMapsDateInstance(final PrometheusMapsDateInstance pSource) {
101 theListKey = pSource.getListKey();
102 theOwnerId = pSource.getOwnerId();
103 theDateId = pSource.getDateId();
104 theMap = new LinkedHashMap<>();
105 allowNull = pSource.allowNull;
106 }
107
108 @Override
109 public MetisFieldSetDef getDataFieldSet() {
110 return FIELD_DEFS;
111 }
112
113 @Override
114 public String formatObject(final OceanusDataFormatter pFormatter) {
115 return PrometheusMapsDateInstance.class.getSimpleName();
116 }
117
118
119
120
121
122
123 MetisListKey getListKey() {
124 return theListKey;
125 }
126
127
128
129
130
131
132 MetisDataFieldId getOwnerId() {
133 return theOwnerId;
134 }
135
136
137
138
139
140
141 MetisDataFieldId getDateId() {
142 return theDateId;
143 }
144
145
146
147
148
149
150 Map<PrometheusDataItem, PrometheusMapsFieldInstance> getMap() {
151 return theMap;
152 }
153
154
155
156
157
158
159 void addItemToMap(final PrometheusDataItem pItem) {
160
161 final MetisFieldSetDef myFieldSet = pItem.getDataFieldSet();
162 final MetisFieldDef myField = myFieldSet.getField(theOwnerId);
163 final PrometheusDataItem myOwner = myField.getFieldValue(pItem, PrometheusDataItem.class);
164
165
166 final PrometheusMapsFieldInstance myMap = theMap.computeIfAbsent(myOwner,
167 r -> new PrometheusMapsFieldInstance(theListKey, theDateId, allowNull));
168 myMap.addItemToMap(pItem);
169 }
170
171
172
173
174
175
176
177 boolean isDateDuplicate(final PrometheusDataItem pItem) {
178
179 final MetisFieldSetDef myFieldSet = pItem.getDataFieldSet();
180 MetisFieldDef myField = myFieldSet.getField(theOwnerId);
181 final PrometheusDataItem myOwner = myField.getFieldValue(pItem, PrometheusDataItem.class);
182
183
184 final PrometheusMapsFieldInstance myMap = theMap.get(myOwner);
185 if (myMap != null) {
186 myField = myFieldSet.getField(theDateId);
187 final Object myDate = myField.getFieldValue(pItem);
188 return myMap.isKeyDuplicate(myDate);
189 }
190 return false;
191 }
192
193
194
195
196
197
198
199
200 boolean isDateAvailable(final PrometheusDataItem pOwner,
201 final OceanusDate pDate) {
202 final PrometheusMapsFieldInstance myMap = theMap.get(pOwner);
203 return myMap == null || myMap.isKeyAvailable(pDate);
204 }
205
206
207
208
209 void resetMap() {
210 theMap.clear();
211 }
212 }