001// -------------------------------------------------------------------------------- 002// Copyright 2002-2026 Echo Three, LLC 003// 004// Licensed under the Apache License, Version 2.0 (the "License"); 005// you may not use this file except in compliance with the License. 006// You may obtain a copy of the License at 007// 008// http://www.apache.org/licenses/LICENSE-2.0 009// 010// Unless required by applicable law or agreed to in writing, software 011// distributed under the License is distributed on an "AS IS" BASIS, 012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013// See the License for the specific language governing permissions and 014// limitations under the License. 015// -------------------------------------------------------------------------------- 016 017package com.echothree.model.control.selector.server.evaluator; 018 019import com.echothree.model.control.selector.common.SelectorKinds; 020import com.echothree.model.control.selector.server.control.SelectorControl; 021import com.echothree.model.data.selector.server.entity.Selector; 022import com.echothree.model.data.selector.server.entity.SelectorNode; 023import com.echothree.model.data.selector.server.entity.SelectorNodeBoolean; 024import com.echothree.model.data.selector.server.entity.SelectorNodeDetail; 025import com.echothree.model.data.selector.server.entity.SelectorNodeEntityListItem; 026import com.echothree.model.data.selector.server.entity.SelectorNodeGeoCode; 027import com.echothree.model.data.selector.server.entity.SelectorNodeItemAccountingCategory; 028import com.echothree.model.data.selector.server.entity.SelectorNodeItemCategory; 029import com.echothree.model.data.selector.server.entity.SelectorNodeItemPurchasingCategory; 030import com.echothree.model.data.selector.server.entity.SelectorNodeResponsibilityType; 031import com.echothree.model.data.selector.server.entity.SelectorNodeSkillType; 032import com.echothree.model.data.selector.server.entity.SelectorNodeTrainingClass; 033import com.echothree.model.data.selector.server.entity.SelectorNodeWorkflowStep; 034import com.echothree.util.server.persistence.Session; 035import java.util.HashMap; 036import java.util.Map; 037 038public class CachedSelector { 039 040 SelectorControl selectorControl = Session.getModelController(SelectorControl.class); 041 042 Selector selector; 043 044 SelectorNodeDetail rootSelectorNodeDetail; 045 046 Map<SelectorNode, SelectorNodeDetail> selectorNodes; 047 Map<SelectorNode, SelectorNodeBoolean> selectorNodeBooleans; 048 Map<SelectorNode, SelectorNodeEntityListItem> selectorNodeEntityListItems; 049 Map<SelectorNode, SelectorNodeWorkflowStep> selectorNodeWorkflowSteps; 050 Map<SelectorNode, SelectorNodeResponsibilityType> selectorNodeResponsibilityTypes; 051 Map<SelectorNode, SelectorNodeSkillType> selectorNodeSkillTypes; 052 Map<SelectorNode, SelectorNodeTrainingClass> selectorNodeTrainingClasses; 053 Map<SelectorNode, SelectorNodeGeoCode> selectorNodeGeoCodes; 054 Map<SelectorNode, SelectorNodeItemCategory> selectorNodeItemCategories; 055 Map<SelectorNode, SelectorNodeItemAccountingCategory> selectorNodeItemAccountingCategories; 056 Map<SelectorNode, SelectorNodeItemPurchasingCategory> selectorNodeItemPurchasingCategories; 057 058 /** Create a new instance of CachedSelector and fill in the details that are cached for the Selector */ 059 public CachedSelector(Selector selector) { 060 init(selector); 061 } 062 063 private void init(final Selector selector) { 064 var selectorDetail = selector.getLastDetail(); 065 var selectorKindName = selectorDetail.getSelectorType().getLastDetail().getSelectorKind().getLastDetail().getSelectorKindName(); 066 067 this.selector = selector; 068 069 cacheSelectorNodes(); 070 cacheSelectorNodeBooleans(); 071 cacheSelectorNodeEntityListItems(); 072 cacheSelectorNodeWorkflowSteps(); 073 074 if(selectorKindName.equals(SelectorKinds.CUSTOMER.name()) || 075 selectorKindName.equals(SelectorKinds.EMPLOYEE.name()) || 076 selectorKindName.equals(SelectorKinds.VENDOR.name())) { 077 cacheSelectorNodeResponsibilityTypes(); 078 cacheSelectorNodeSkillTypes(); 079 cacheSelectorNodeTrainingClasses(); 080 } 081 082 if(selectorKindName.equals(SelectorKinds.POSTAL_ADDRESS.name())) { 083 cacheSelectorNodeGeoCodes(); 084 } 085 086 if(selectorKindName.equals(SelectorKinds.ITEM.name())) { 087 cacheSelectorNodeItemCategories(); 088 cacheSelectorNodeItemAccountingCategories(); 089 cacheSelectorNodeItemPurchasingCategories(); 090 } 091 } 092 093 /** Copy the rawSelectorNodes into the selectorNodes Map that uses the SelectorNode as the key, and 094 * the SelectorNodeDetail as the value. 095 */ 096 private void cacheSelectorNodes() { 097 var rawSelectorNodes = selectorControl.getSelectorNodesBySelector(selector); 098 var size = rawSelectorNodes.size(); 099 100 selectorNodes = new HashMap<>(size); 101 102 if(size > 0) { 103 rawSelectorNodes.forEach((selectorNode) -> { 104 var selectorNodeDetail = selectorNode.getLastDetail(); 105 106 if(selectorNodeDetail.getIsRootSelectorNode()) { 107 rootSelectorNodeDetail = selectorNodeDetail; 108 } 109 110 selectorNodes.put(selectorNode, selectorNodeDetail); 111 }); 112 } 113 } 114 115 /** Copy rawSelectorNodeBooleans into the selectorNodeBooleans Map, SelectorNode is the key, 116 * SelectorNodeBoolean is the value. 117 */ 118 private void cacheSelectorNodeBooleans() { 119 var rawSelectorNodeBooleans = selectorControl.getSelectorNodeBooleansBySelector(selector); 120 var size = rawSelectorNodeBooleans.size(); 121 122 if(size > 0) { 123 selectorNodeBooleans = new HashMap<>(size); 124 125 rawSelectorNodeBooleans.forEach((selectorNodeBoolean) -> { 126 selectorNodeBooleans.put(selectorNodeBoolean.getSelectorNode(), selectorNodeBoolean); 127 }); 128 } else 129 selectorNodeBooleans = null; 130 } 131 132 /** Copy rawSelectorNodeEntityListItems into the selectorNodeEntityListItems Map, SelectorNode is the key, 133 * SelectorNodeEntityListItem is the value. 134 */ 135 private void cacheSelectorNodeEntityListItems() { 136 var rawSelectorNodeEntityListItems = selectorControl.getSelectorNodeEntityListItemsBySelector(selector); 137 var size = rawSelectorNodeEntityListItems.size(); 138 139 if(size > 0) { 140 selectorNodeEntityListItems = new HashMap<>(size); 141 142 rawSelectorNodeEntityListItems.forEach((selectorNodeEntityListItem) -> { 143 selectorNodeEntityListItems.put(selectorNodeEntityListItem.getSelectorNode(), selectorNodeEntityListItem); 144 }); 145 } else 146 selectorNodeEntityListItems = null; 147 } 148 149 /** Copy rawSelectorNodeWorkflowSteps into the selectorNodeWorkflowSteps Map, SelectorNode is the key, 150 * SelectorNodeWorkflowStep is the value. 151 */ 152 private void cacheSelectorNodeWorkflowSteps() { 153 var rawSelectorNodeWorkflowSteps = selectorControl.getSelectorNodeWorkflowStepsBySelector(selector); 154 var size = rawSelectorNodeWorkflowSteps.size(); 155 156 if(size > 0) { 157 selectorNodeWorkflowSteps = new HashMap<>(size); 158 159 rawSelectorNodeWorkflowSteps.forEach((selectorNodeWorkflowStep) -> { 160 selectorNodeWorkflowSteps.put(selectorNodeWorkflowStep.getSelectorNode(), selectorNodeWorkflowStep); 161 }); 162 } else 163 selectorNodeWorkflowSteps = null; 164 } 165 166 /** Copy rawSelectorNodeResponsibilityTypes into the selectorNodeResponsibilityTypes Map, SelectorNode is the key, 167 * SelectorNodeResponsibilityType is the value. 168 */ 169 private void cacheSelectorNodeResponsibilityTypes() { 170 var rawSelectorNodeResponsibilityTypes = selectorControl.getSelectorNodeResponsibilityTypesBySelector(selector); 171 var size = rawSelectorNodeResponsibilityTypes.size(); 172 173 if(size > 0) { 174 selectorNodeResponsibilityTypes = new HashMap<>(size); 175 176 rawSelectorNodeResponsibilityTypes.forEach((selectorNodeResponsibilityType) -> { 177 selectorNodeResponsibilityTypes.put(selectorNodeResponsibilityType.getSelectorNode(), selectorNodeResponsibilityType); 178 }); 179 } else 180 selectorNodeResponsibilityTypes = null; 181 } 182 183 /** Copy rawSelectorNodeSkillTypes into the selectorNodeSkillTypes Map, SelectorNode is the key, 184 * SelectorNodeSkillType is the value. 185 */ 186 private void cacheSelectorNodeSkillTypes() { 187 var rawSelectorNodeSkillTypes = selectorControl.getSelectorNodeSkillTypesBySelector(selector); 188 var size = rawSelectorNodeSkillTypes.size(); 189 190 if(size > 0) { 191 selectorNodeSkillTypes = new HashMap<>(size); 192 193 rawSelectorNodeSkillTypes.forEach((selectorNodeSkillType) -> { 194 selectorNodeSkillTypes.put(selectorNodeSkillType.getSelectorNode(), selectorNodeSkillType); 195 }); 196 } else 197 selectorNodeSkillTypes = null; 198 } 199 200 /** Copy rawSelectorNodeTrainingClasses into the selectorNodeTrainingClasses Map, SelectorNode is the key, 201 * SelectorNodeTrainingClass is the value. 202 */ 203 private void cacheSelectorNodeTrainingClasses() { 204 var rawSelectorNodeTrainingClasses = selectorControl.getSelectorNodeTrainingClassesBySelector(selector); 205 var size = rawSelectorNodeTrainingClasses.size(); 206 207 if(size > 0) { 208 selectorNodeTrainingClasses = new HashMap<>(size); 209 210 rawSelectorNodeTrainingClasses.forEach((selectorNodeTrainingClass) -> { 211 selectorNodeTrainingClasses.put(selectorNodeTrainingClass.getSelectorNode(), selectorNodeTrainingClass); 212 }); 213 } else 214 selectorNodeTrainingClasses = null; 215 } 216 217 /** Copy rawSelectorNodeGeoCodes into the selectorNodeGeoCodes Map, SelectorNode is the key, 218 * SelectorNodeGeoCode is the value. 219 */ 220 private void cacheSelectorNodeGeoCodes() { 221 var rawSelectorNodeGeoCodes = selectorControl.getSelectorNodeGeoCodesBySelector(selector); 222 var size = rawSelectorNodeGeoCodes.size(); 223 224 if(size > 0) { 225 selectorNodeGeoCodes = new HashMap<>(size); 226 227 rawSelectorNodeGeoCodes.forEach((selectorNodeGeoCode) -> { 228 selectorNodeGeoCodes.put(selectorNodeGeoCode.getSelectorNode(), selectorNodeGeoCode); 229 }); 230 } else 231 selectorNodeGeoCodes = null; 232 } 233 234 /** Copy rawSelectorNodeItemCategories into the selectorNodeItemCategories Map, SelectorNode is the key, 235 * SelectorNodeItemCategory is the value. 236 */ 237 private void cacheSelectorNodeItemCategories() { 238 var rawSelectorNodeItemCategories = selectorControl.getSelectorNodeItemCategoriesBySelector(selector); 239 var size = rawSelectorNodeItemCategories.size(); 240 241 if(size > 0) { 242 selectorNodeItemCategories = new HashMap<>(size); 243 244 rawSelectorNodeItemCategories.forEach((selectorNodeItemCategory) -> { 245 selectorNodeItemCategories.put(selectorNodeItemCategory.getSelectorNode(), selectorNodeItemCategory); 246 }); 247 } else 248 selectorNodeItemCategories = null; 249 } 250 251 /** Copy rawSelectorNodeItemAccountingCategories into the selectorNodeItemAccountingCategories Map, SelectorNode is the key, 252 * SelectorNodeItemAccountingCategory is the value. 253 */ 254 private void cacheSelectorNodeItemAccountingCategories() { 255 var rawSelectorNodeItemAccountingCategories = selectorControl.getSelectorNodeItemAccountingCategoriesBySelector(selector); 256 var size = rawSelectorNodeItemAccountingCategories.size(); 257 258 if(size > 0) { 259 selectorNodeItemAccountingCategories = new HashMap<>(size); 260 261 rawSelectorNodeItemAccountingCategories.forEach((selectorNodeItemAccountingCategory) -> { 262 selectorNodeItemAccountingCategories.put(selectorNodeItemAccountingCategory.getSelectorNode(), selectorNodeItemAccountingCategory); 263 }); 264 } else 265 selectorNodeItemAccountingCategories = null; 266 } 267 268 /** Copy rawSelectorNodeItemPurchasingCategories into the selectorNodeItemPurchasingCategories Map, SelectorNode is the key, 269 * SelectorNodeItemPurchasingCategory is the value. 270 */ 271 private void cacheSelectorNodeItemPurchasingCategories() { 272 var rawSelectorNodeItemPurchasingCategories = selectorControl.getSelectorNodeItemPurchasingCategoriesBySelector(selector); 273 var size = rawSelectorNodeItemPurchasingCategories.size(); 274 275 if(size > 0) { 276 selectorNodeItemPurchasingCategories = new HashMap<>(size); 277 278 rawSelectorNodeItemPurchasingCategories.forEach((selectorNodeItemPurchasingCategory) -> { 279 selectorNodeItemPurchasingCategories.put(selectorNodeItemPurchasingCategory.getSelectorNode(), selectorNodeItemPurchasingCategory); 280 }); 281 } else 282 selectorNodeItemPurchasingCategories = null; 283 } 284 285 public Selector getSelector() { 286 return selector; 287 } 288 289 public SelectorNodeDetail getRootSelectorNodeDetail() { 290 return rootSelectorNodeDetail; 291 } 292 293 public SelectorNodeDetail getSelectorNodeDetailFromSelectorNode(SelectorNode selectorNode) { 294 return selectorNodes.get(selectorNode); 295 } 296 297 public SelectorNodeBoolean getSelectorNodeBooleanFromSelectorNode(SelectorNode selectorNode) { 298 return selectorNodeBooleans.get(selectorNode); 299 } 300 301 public SelectorNodeBoolean getSelectorNodeBooleanFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 302 return selectorNodeBooleans.get(selectorNodeDetail.getSelectorNode()); 303 } 304 305 public SelectorNodeEntityListItem getSelectorNodeEntityListItemFromSelectorNode(SelectorNode selectorNode) { 306 return selectorNodeEntityListItems.get(selectorNode); 307 } 308 309 public SelectorNodeEntityListItem getSelectorNodeEntityListItemFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 310 return selectorNodeEntityListItems.get(selectorNodeDetail.getSelectorNode()); 311 } 312 313 public SelectorNodeWorkflowStep getSelectorNodeWorkflowStepFromSelectorNode(SelectorNode selectorNode) { 314 return selectorNodeWorkflowSteps.get(selectorNode); 315 } 316 317 public SelectorNodeWorkflowStep getSelectorNodeWorkflowStepFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 318 return selectorNodeWorkflowSteps.get(selectorNodeDetail.getSelectorNode()); 319 } 320 321 public SelectorNodeResponsibilityType getSelectorNodeResponsibilityTypeFromSelectorNode(SelectorNode selectorNode) { 322 return selectorNodeResponsibilityTypes.get(selectorNode); 323 } 324 325 public SelectorNodeResponsibilityType getSelectorNodeResponsibilityTypeFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 326 return selectorNodeResponsibilityTypes.get(selectorNodeDetail.getSelectorNode()); 327 } 328 329 public SelectorNodeSkillType getSelectorNodeSkillTypeFromSelectorNode(SelectorNode selectorNode) { 330 return selectorNodeSkillTypes.get(selectorNode); 331 } 332 333 public SelectorNodeSkillType getSelectorNodeSkillTypeFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 334 return selectorNodeSkillTypes.get(selectorNodeDetail.getSelectorNode()); 335 } 336 337 public SelectorNodeTrainingClass getSelectorNodeTrainingClassFromSelectorNode(SelectorNode selectorNode) { 338 return selectorNodeTrainingClasses.get(selectorNode); 339 } 340 341 public SelectorNodeTrainingClass getSelectorNodeTrainingClassFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 342 return selectorNodeTrainingClasses.get(selectorNodeDetail.getSelectorNode()); 343 } 344 345 public SelectorNodeGeoCode getSelectorNodeGeoCodeFromSelectorNode(SelectorNode selectorNode) { 346 return selectorNodeGeoCodes.get(selectorNode); 347 } 348 349 public SelectorNodeGeoCode getSelectorNodeGeoCodeFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 350 return selectorNodeGeoCodes.get(selectorNodeDetail.getSelectorNode()); 351 } 352 353 public SelectorNodeItemCategory getSelectorNodeItemCategoryFromSelectorNode(SelectorNode selectorNode) { 354 return selectorNodeItemCategories.get(selectorNode); 355 } 356 357 public SelectorNodeItemCategory getSelectorNodeItemCategoryFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 358 return selectorNodeItemCategories.get(selectorNodeDetail.getSelectorNode()); 359 } 360 361 public SelectorNodeItemAccountingCategory getSelectorNodeItemAccountingCategoryFromSelectorNode(SelectorNode selectorNode) { 362 return selectorNodeItemAccountingCategories.get(selectorNode); 363 } 364 365 public SelectorNodeItemAccountingCategory getSelectorNodeItemAccountingCategoryFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 366 return selectorNodeItemAccountingCategories.get(selectorNodeDetail.getSelectorNode()); 367 } 368 369 public SelectorNodeItemPurchasingCategory getSelectorNodeItemPurchasingCategoryFromSelectorNode(SelectorNode selectorNode) { 370 return selectorNodeItemPurchasingCategories.get(selectorNode); 371 } 372 373 public SelectorNodeItemPurchasingCategory getSelectorNodeItemPurchasingCategoryFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 374 return selectorNodeItemPurchasingCategories.get(selectorNodeDetail.getSelectorNode()); 375 } 376 377}