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}