001// -------------------------------------------------------------------------------- 002// Copyright 2002-2025 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 /** Creates a new instance of CachedSelector */ 060 public CachedSelector(Selector selector) { 061 init(selector); 062 } 063 064 private void init(final Selector selector) { 065 var selectorDetail = selector.getLastDetail(); 066 var selectorKindName = selectorDetail.getSelectorType().getLastDetail().getSelectorKind().getLastDetail().getSelectorKindName(); 067 068 this.selector = selector; 069 070 cacheSelectorNodes(); 071 cacheSelectorNodeBooleans(); 072 cacheSelectorNodeEntityListItems(); 073 cacheSelectorNodeWorkflowSteps(); 074 075 if(selectorKindName.equals(SelectorKinds.CUSTOMER.name()) || 076 selectorKindName.equals(SelectorKinds.EMPLOYEE.name()) || 077 selectorKindName.equals(SelectorKinds.VENDOR.name())) { 078 cacheSelectorNodeResponsibilityTypes(); 079 cacheSelectorNodeSkillTypes(); 080 cacheSelectorNodeTrainingClasses(); 081 } 082 083 if(selectorKindName.equals(SelectorKinds.POSTAL_ADDRESS.name())) { 084 cacheSelectorNodeGeoCodes(); 085 } 086 087 if(selectorKindName.equals(SelectorKinds.ITEM.name())) { 088 cacheSelectorNodeItemCategories(); 089 cacheSelectorNodeItemAccountingCategories(); 090 cacheSelectorNodeItemPurchasingCategories(); 091 } 092 } 093 094 /** Copy the rawSelectorNodes into the selectorNodes Map that uses the SelectorNode as the key, and 095 * the SelectorNodeDetail as the value. 096 */ 097 private void cacheSelectorNodes() { 098 var rawSelectorNodes = selectorControl.getSelectorNodesBySelector(selector); 099 var size = rawSelectorNodes.size(); 100 101 selectorNodes = new HashMap<>(size); 102 103 if(size > 0) { 104 rawSelectorNodes.forEach((selectorNode) -> { 105 var selectorNodeDetail = selectorNode.getLastDetail(); 106 107 if(selectorNodeDetail.getIsRootSelectorNode()) { 108 rootSelectorNodeDetail = selectorNodeDetail; 109 } 110 111 selectorNodes.put(selectorNode, selectorNodeDetail); 112 }); 113 } 114 } 115 116 /** Copy rawSelectorNodeBooleans into the selectorNodeBooleans Map, SelectorNode is the key, 117 * SelectorNodeBoolean is the value. 118 */ 119 private void cacheSelectorNodeBooleans() { 120 var rawSelectorNodeBooleans = selectorControl.getSelectorNodeBooleansBySelector(selector); 121 var size = rawSelectorNodeBooleans.size(); 122 123 if(size > 0) { 124 selectorNodeBooleans = new HashMap<>(size); 125 126 rawSelectorNodeBooleans.forEach((selectorNodeBoolean) -> { 127 selectorNodeBooleans.put(selectorNodeBoolean.getSelectorNode(), selectorNodeBoolean); 128 }); 129 } else 130 selectorNodeBooleans = null; 131 } 132 133 /** Copy rawSelectorNodeEntityListItems into the selectorNodeEntityListItems Map, SelectorNode is the key, 134 * SelectorNodeEntityListItem is the value. 135 */ 136 private void cacheSelectorNodeEntityListItems() { 137 var rawSelectorNodeEntityListItems = selectorControl.getSelectorNodeEntityListItemsBySelector(selector); 138 var size = rawSelectorNodeEntityListItems.size(); 139 140 if(size > 0) { 141 selectorNodeEntityListItems = new HashMap<>(size); 142 143 rawSelectorNodeEntityListItems.forEach((selectorNodeEntityListItem) -> { 144 selectorNodeEntityListItems.put(selectorNodeEntityListItem.getSelectorNode(), selectorNodeEntityListItem); 145 }); 146 } else 147 selectorNodeEntityListItems = null; 148 } 149 150 /** Copy rawSelectorNodeWorkflowSteps into the selectorNodeWorkflowSteps Map, SelectorNode is the key, 151 * SelectorNodeWorkflowStep is the value. 152 */ 153 private void cacheSelectorNodeWorkflowSteps() { 154 var rawSelectorNodeWorkflowSteps = selectorControl.getSelectorNodeWorkflowStepsBySelector(selector); 155 var size = rawSelectorNodeWorkflowSteps.size(); 156 157 if(size > 0) { 158 selectorNodeWorkflowSteps = new HashMap<>(size); 159 160 rawSelectorNodeWorkflowSteps.forEach((selectorNodeWorkflowStep) -> { 161 selectorNodeWorkflowSteps.put(selectorNodeWorkflowStep.getSelectorNode(), selectorNodeWorkflowStep); 162 }); 163 } else 164 selectorNodeWorkflowSteps = null; 165 } 166 167 /** Copy rawSelectorNodeResponsibilityTypes into the selectorNodeResponsibilityTypes Map, SelectorNode is the key, 168 * SelectorNodeResponsibilityType is the value. 169 */ 170 private void cacheSelectorNodeResponsibilityTypes() { 171 var rawSelectorNodeResponsibilityTypes = selectorControl.getSelectorNodeResponsibilityTypesBySelector(selector); 172 var size = rawSelectorNodeResponsibilityTypes.size(); 173 174 if(size > 0) { 175 selectorNodeResponsibilityTypes = new HashMap<>(size); 176 177 rawSelectorNodeResponsibilityTypes.forEach((selectorNodeResponsibilityType) -> { 178 selectorNodeResponsibilityTypes.put(selectorNodeResponsibilityType.getSelectorNode(), selectorNodeResponsibilityType); 179 }); 180 } else 181 selectorNodeResponsibilityTypes = null; 182 } 183 184 /** Copy rawSelectorNodeSkillTypes into the selectorNodeSkillTypes Map, SelectorNode is the key, 185 * SelectorNodeSkillType is the value. 186 */ 187 private void cacheSelectorNodeSkillTypes() { 188 var rawSelectorNodeSkillTypes = selectorControl.getSelectorNodeSkillTypesBySelector(selector); 189 var size = rawSelectorNodeSkillTypes.size(); 190 191 if(size > 0) { 192 selectorNodeSkillTypes = new HashMap<>(size); 193 194 rawSelectorNodeSkillTypes.forEach((selectorNodeSkillType) -> { 195 selectorNodeSkillTypes.put(selectorNodeSkillType.getSelectorNode(), selectorNodeSkillType); 196 }); 197 } else 198 selectorNodeSkillTypes = null; 199 } 200 201 /** Copy rawSelectorNodeTrainingClasses into the selectorNodeTrainingClasses Map, SelectorNode is the key, 202 * SelectorNodeTrainingClass is the value. 203 */ 204 private void cacheSelectorNodeTrainingClasses() { 205 var rawSelectorNodeTrainingClasses = selectorControl.getSelectorNodeTrainingClassesBySelector(selector); 206 var size = rawSelectorNodeTrainingClasses.size(); 207 208 if(size > 0) { 209 selectorNodeTrainingClasses = new HashMap<>(size); 210 211 rawSelectorNodeTrainingClasses.forEach((selectorNodeTrainingClass) -> { 212 selectorNodeTrainingClasses.put(selectorNodeTrainingClass.getSelectorNode(), selectorNodeTrainingClass); 213 }); 214 } else 215 selectorNodeTrainingClasses = null; 216 } 217 218 /** Copy rawSelectorNodeGeoCodes into the selectorNodeGeoCodes Map, SelectorNode is the key, 219 * SelectorNodeGeoCode is the value. 220 */ 221 private void cacheSelectorNodeGeoCodes() { 222 var rawSelectorNodeGeoCodes = selectorControl.getSelectorNodeGeoCodesBySelector(selector); 223 var size = rawSelectorNodeGeoCodes.size(); 224 225 if(size > 0) { 226 selectorNodeGeoCodes = new HashMap<>(size); 227 228 rawSelectorNodeGeoCodes.forEach((selectorNodeGeoCode) -> { 229 selectorNodeGeoCodes.put(selectorNodeGeoCode.getSelectorNode(), selectorNodeGeoCode); 230 }); 231 } else 232 selectorNodeGeoCodes = null; 233 } 234 235 /** Copy rawSelectorNodeItemCategories into the selectorNodeItemCategories Map, SelectorNode is the key, 236 * SelectorNodeItemCategory is the value. 237 */ 238 private void cacheSelectorNodeItemCategories() { 239 var rawSelectorNodeItemCategories = selectorControl.getSelectorNodeItemCategoriesBySelector(selector); 240 var size = rawSelectorNodeItemCategories.size(); 241 242 if(size > 0) { 243 selectorNodeItemCategories = new HashMap<>(size); 244 245 rawSelectorNodeItemCategories.forEach((selectorNodeItemCategory) -> { 246 selectorNodeItemCategories.put(selectorNodeItemCategory.getSelectorNode(), selectorNodeItemCategory); 247 }); 248 } else 249 selectorNodeItemCategories = null; 250 } 251 252 /** Copy rawSelectorNodeItemAccountingCategories into the selectorNodeItemAccountingCategories Map, SelectorNode is the key, 253 * SelectorNodeItemAccountingCategory is the value. 254 */ 255 private void cacheSelectorNodeItemAccountingCategories() { 256 var rawSelectorNodeItemAccountingCategories = selectorControl.getSelectorNodeItemAccountingCategoriesBySelector(selector); 257 var size = rawSelectorNodeItemAccountingCategories.size(); 258 259 if(size > 0) { 260 selectorNodeItemAccountingCategories = new HashMap<>(size); 261 262 rawSelectorNodeItemAccountingCategories.forEach((selectorNodeItemAccountingCategory) -> { 263 selectorNodeItemAccountingCategories.put(selectorNodeItemAccountingCategory.getSelectorNode(), selectorNodeItemAccountingCategory); 264 }); 265 } else 266 selectorNodeItemAccountingCategories = null; 267 } 268 269 /** Copy rawSelectorNodeItemPurchasingCategories into the selectorNodeItemPurchasingCategories Map, SelectorNode is the key, 270 * SelectorNodeItemPurchasingCategory is the value. 271 */ 272 private void cacheSelectorNodeItemPurchasingCategories() { 273 var rawSelectorNodeItemPurchasingCategories = selectorControl.getSelectorNodeItemPurchasingCategoriesBySelector(selector); 274 var size = rawSelectorNodeItemPurchasingCategories.size(); 275 276 if(size > 0) { 277 selectorNodeItemPurchasingCategories = new HashMap<>(size); 278 279 rawSelectorNodeItemPurchasingCategories.forEach((selectorNodeItemPurchasingCategory) -> { 280 selectorNodeItemPurchasingCategories.put(selectorNodeItemPurchasingCategory.getSelectorNode(), selectorNodeItemPurchasingCategory); 281 }); 282 } else 283 selectorNodeItemPurchasingCategories = null; 284 } 285 286 public Selector getSelector() { 287 return selector; 288 } 289 290 public SelectorNodeDetail getRootSelectorNodeDetail() { 291 return rootSelectorNodeDetail; 292 } 293 294 public SelectorNodeDetail getSelectorNodeDetailFromSelectorNode(SelectorNode selectorNode) { 295 return selectorNodes.get(selectorNode); 296 } 297 298 public SelectorNodeBoolean getSelectorNodeBooleanFromSelectorNode(SelectorNode selectorNode) { 299 return selectorNodeBooleans.get(selectorNode); 300 } 301 302 public SelectorNodeBoolean getSelectorNodeBooleanFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 303 return selectorNodeBooleans.get(selectorNodeDetail.getSelectorNode()); 304 } 305 306 public SelectorNodeEntityListItem getSelectorNodeEntityListItemFromSelectorNode(SelectorNode selectorNode) { 307 return selectorNodeEntityListItems.get(selectorNode); 308 } 309 310 public SelectorNodeEntityListItem getSelectorNodeEntityListItemFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 311 return selectorNodeEntityListItems.get(selectorNodeDetail.getSelectorNode()); 312 } 313 314 public SelectorNodeWorkflowStep getSelectorNodeWorkflowStepFromSelectorNode(SelectorNode selectorNode) { 315 return selectorNodeWorkflowSteps.get(selectorNode); 316 } 317 318 public SelectorNodeWorkflowStep getSelectorNodeWorkflowStepFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 319 return selectorNodeWorkflowSteps.get(selectorNodeDetail.getSelectorNode()); 320 } 321 322 public SelectorNodeResponsibilityType getSelectorNodeResponsibilityTypeFromSelectorNode(SelectorNode selectorNode) { 323 return selectorNodeResponsibilityTypes.get(selectorNode); 324 } 325 326 public SelectorNodeResponsibilityType getSelectorNodeResponsibilityTypeFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 327 return selectorNodeResponsibilityTypes.get(selectorNodeDetail.getSelectorNode()); 328 } 329 330 public SelectorNodeSkillType getSelectorNodeSkillTypeFromSelectorNode(SelectorNode selectorNode) { 331 return selectorNodeSkillTypes.get(selectorNode); 332 } 333 334 public SelectorNodeSkillType getSelectorNodeSkillTypeFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 335 return selectorNodeSkillTypes.get(selectorNodeDetail.getSelectorNode()); 336 } 337 338 public SelectorNodeTrainingClass getSelectorNodeTrainingClassFromSelectorNode(SelectorNode selectorNode) { 339 return selectorNodeTrainingClasses.get(selectorNode); 340 } 341 342 public SelectorNodeTrainingClass getSelectorNodeTrainingClassFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 343 return selectorNodeTrainingClasses.get(selectorNodeDetail.getSelectorNode()); 344 } 345 346 public SelectorNodeGeoCode getSelectorNodeGeoCodeFromSelectorNode(SelectorNode selectorNode) { 347 return selectorNodeGeoCodes.get(selectorNode); 348 } 349 350 public SelectorNodeGeoCode getSelectorNodeGeoCodeFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 351 return selectorNodeGeoCodes.get(selectorNodeDetail.getSelectorNode()); 352 } 353 354 public SelectorNodeItemCategory getSelectorNodeItemCategoryFromSelectorNode(SelectorNode selectorNode) { 355 return selectorNodeItemCategories.get(selectorNode); 356 } 357 358 public SelectorNodeItemCategory getSelectorNodeItemCategoryFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 359 return selectorNodeItemCategories.get(selectorNodeDetail.getSelectorNode()); 360 } 361 362 public SelectorNodeItemAccountingCategory getSelectorNodeItemAccountingCategoryFromSelectorNode(SelectorNode selectorNode) { 363 return selectorNodeItemAccountingCategories.get(selectorNode); 364 } 365 366 public SelectorNodeItemAccountingCategory getSelectorNodeItemAccountingCategoryFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 367 return selectorNodeItemAccountingCategories.get(selectorNodeDetail.getSelectorNode()); 368 } 369 370 public SelectorNodeItemPurchasingCategory getSelectorNodeItemPurchasingCategoryFromSelectorNode(SelectorNode selectorNode) { 371 return selectorNodeItemPurchasingCategories.get(selectorNode); 372 } 373 374 public SelectorNodeItemPurchasingCategory getSelectorNodeItemPurchasingCategoryFromSelectorNodeDetail(SelectorNodeDetail selectorNodeDetail) { 375 return selectorNodeItemPurchasingCategories.get(selectorNodeDetail.getSelectorNode()); 376 } 377 378}