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}