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