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.party.server.search;
018
019import static com.echothree.model.jooq.server.keys.contact.ContactForeignKeys.PARTY_CONTACT_MECHANISMS_ACTIVE_DETAIL_FK;
020import static com.echothree.model.jooq.server.keys.contact.ContactForeignKeys.PARTY_CONTACT_MECHANISM_DETAILS_PARTY_FK;
021import static com.echothree.model.jooq.server.keys.core.CoreForeignKeys.ENTITY_TIMES_ENTITY_INSTANCE_FK;
022import static com.echothree.model.jooq.server.keys.party.PartyForeignKeys.PARTIES_ACTIVE_DETAIL_FK;
023import static com.echothree.model.jooq.server.keys.party.PartyForeignKeys.PEOPLE_PARTY_FK;
024import static com.echothree.model.jooq.server.tables.contact.ContactEmailAddresses.ContactEmailAddresses;
025import static com.echothree.model.jooq.server.tables.contact.ContactTelephones.ContactTelephones;
026import static com.echothree.model.jooq.server.tables.contact.PartyContactMechanismDetails.PartyContactMechanismDetails;
027import static com.echothree.model.jooq.server.tables.contact.PartyContactMechanisms.PartyContactMechanisms;
028import static com.echothree.model.jooq.server.tables.core.EntityInstances.EntityInstances;
029import static com.echothree.model.jooq.server.tables.core.EntityTimes.EntityTimes;
030import static com.echothree.model.jooq.server.tables.party.Parties.Parties;
031import static com.echothree.model.jooq.server.tables.party.PartyDetails.PartyDetails;
032import static com.echothree.model.jooq.server.tables.party.People.People;
033import com.echothree.model.control.core.common.ComponentVendors;
034import com.echothree.model.control.core.common.EntityTypes;
035import com.echothree.model.control.core.server.control.EntityInstanceControl;
036import com.echothree.model.control.index.common.IndexFields;
037import com.echothree.model.control.index.server.analyzer.BasicAnalyzer;
038import com.echothree.model.control.party.server.analyzer.PartyAnalyzer;
039import com.echothree.model.control.party.server.control.PartyControl;
040import com.echothree.model.control.party.server.logic.PartyLogic;
041import com.echothree.model.control.search.server.search.BaseSearchEvaluator;
042import com.echothree.model.control.search.server.search.EntityInstancePKHolder;
043import com.echothree.model.data.geo.server.entity.GeoCode;
044import com.echothree.model.data.party.server.entity.Language;
045import com.echothree.model.data.party.server.entity.Party;
046import com.echothree.model.data.party.server.entity.PartyAliasType;
047import com.echothree.model.data.party.server.entity.PartyType;
048import com.echothree.model.data.search.server.entity.SearchDefaultOperator;
049import com.echothree.model.data.search.server.entity.SearchSortDirection;
050import com.echothree.model.data.search.server.entity.SearchSortOrder;
051import com.echothree.model.data.search.server.entity.SearchType;
052import com.echothree.model.data.user.server.entity.UserVisit;
053import com.echothree.util.server.message.ExecutionErrorAccumulator;
054import com.echothree.util.server.persistence.Session;
055
056public class PartySearchEvaluator
057        extends BaseSearchEvaluator {
058    
059    protected PartyType partyType;
060    protected String entityNameIndexField;
061    private String firstName;
062    private Boolean firstNameSoundex;
063    private String middleName;
064    private Boolean middleNameSoundex;
065    private String lastName;
066    private Boolean lastNameSoundex;
067    private GeoCode countryGeoCode;
068    private String areaCode;
069    private String telephoneNumber;
070    private String telephoneExtension;
071    private String emailAddress;
072    private String partyName;
073    private PartyAliasType partyAliasType;
074    private String alias;
075    
076    protected PartySearchEvaluator(UserVisit userVisit, SearchType searchType, SearchDefaultOperator searchDefaultOperator, SearchSortOrder searchSortOrder,
077            SearchSortDirection searchSortDirection, String partyTypeName, final String entityNameIndexField, String indexName) {
078        super(userVisit, searchDefaultOperator, searchType, searchSortOrder, searchSortDirection, null, ComponentVendors.ECHO_THREE.name(),
079                EntityTypes.Party.name(), null, null, indexName);
080        
081        this.partyType = PartyLogic.getInstance().getPartyTypeByName(null, partyTypeName);
082        this.entityNameIndexField = entityNameIndexField;
083        
084        setField(IndexFields.name.name());
085    }
086    
087    @Override
088    public EntityInstancePKHolder getEntityInstancePKHolderByCreatedTime(Long createdTime) {
089        // Custom version for PartySearchEvaluator that takes into account the PartyType.
090        var query = session.getDslContext()
091                .select(EntityInstances.ENTITY_INSTANCE)
092                .from(EntityInstances)
093                .join(EntityTimes).onKey(ENTITY_TIMES_ENTITY_INSTANCE_FK)
094                .join(Parties).on(Parties.PARTY.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE))
095                .join(PartyDetails).onKey(PARTIES_ACTIVE_DETAIL_FK)
096                .where(PartyDetails.PARTY_TYPE.eq(partyType.getPrimaryKey()),
097                        EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey()),
098                        EntityTimes.CREATED_TIME.ge(createdTime));
099
100        return getEntityInstancePKHolderFromQuery(query);
101    }
102
103    @Override
104    public EntityInstancePKHolder getEntityInstancePKHolderByModifiedTime(Long modifiedTime) {
105        // Custom version for PartySearchEvaluator that takes into account the PartyType.
106        var query = session.getDslContext()
107                .select(EntityInstances.ENTITY_INSTANCE)
108                .from(EntityInstances)
109                .join(EntityTimes).onKey(ENTITY_TIMES_ENTITY_INSTANCE_FK)
110                .join(Parties).on(Parties.PARTY.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE))
111                .join(PartyDetails).onKey(PARTIES_ACTIVE_DETAIL_FK)
112                .where(PartyDetails.PARTY_TYPE.eq(partyType.getPrimaryKey()),
113                        EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey()),
114                        EntityTimes.MODIFIED_TIME.ge(modifiedTime));
115
116        return getEntityInstancePKHolderFromQuery(query);
117    }
118
119    public EntityInstancePKHolder getEntityInstancePKHolderByFirstName(String firstName) {
120        var query = session.getDslContext()
121                .select(EntityInstances.ENTITY_INSTANCE)
122                .from(EntityInstances)
123                .join(Parties).on(Parties.PARTY.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE))
124                .join(PartyDetails).onKey(PARTIES_ACTIVE_DETAIL_FK)
125                .join(People).onKey(PEOPLE_PARTY_FK)
126                .where(PartyDetails.PARTY_TYPE.eq(partyType.getPrimaryKey()),
127                        People.FIRST_NAME.eq(firstName),
128                        People.THRU_TIME.eq(Session.MAX_TIME),
129                        EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey()));
130
131        return getEntityInstancePKHolderFromQuery(query);
132    }
133
134    public EntityInstancePKHolder getEntityInstancePKHolderByFirstNameSdx(String firstNameSdx) {
135        var query = session.getDslContext()
136                .select(EntityInstances.ENTITY_INSTANCE)
137                .from(EntityInstances)
138                .join(Parties).on(Parties.PARTY.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE))
139                .join(PartyDetails).onKey(PARTIES_ACTIVE_DETAIL_FK)
140                .join(People).onKey(PEOPLE_PARTY_FK)
141                .where(PartyDetails.PARTY_TYPE.eq(partyType.getPrimaryKey()),
142                        People.FIRST_NAME_SDX.eq(firstNameSdx),
143                        People.THRU_TIME.eq(Session.MAX_TIME),
144                        EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey()));
145
146        return getEntityInstancePKHolderFromQuery(query);
147    }
148
149    public EntityInstancePKHolder getEntityInstancePKHolderByMiddleName(String middleName) {
150        var query = session.getDslContext()
151                .select(EntityInstances.ENTITY_INSTANCE)
152                .from(EntityInstances)
153                .join(Parties).on(Parties.PARTY.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE))
154                .join(PartyDetails).onKey(PARTIES_ACTIVE_DETAIL_FK)
155                .join(People).onKey(PEOPLE_PARTY_FK)
156                .where(PartyDetails.PARTY_TYPE.eq(partyType.getPrimaryKey()),
157                        People.MIDDLE_NAME.eq(middleName),
158                        People.THRU_TIME.eq(Session.MAX_TIME),
159                        EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey()));
160
161        return getEntityInstancePKHolderFromQuery(query);
162    }
163
164    public EntityInstancePKHolder getEntityInstancePKHolderByMiddleNameSdx(String middleNameSdx) {
165        var query = session.getDslContext()
166                .select(EntityInstances.ENTITY_INSTANCE)
167                .from(EntityInstances)
168                .join(Parties).on(Parties.PARTY.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE))
169                .join(PartyDetails).onKey(PARTIES_ACTIVE_DETAIL_FK)
170                .join(People).onKey(PEOPLE_PARTY_FK)
171                .where(PartyDetails.PARTY_TYPE.eq(partyType.getPrimaryKey()),
172                        People.MIDDLE_NAME_SDX.eq(middleNameSdx),
173                        People.THRU_TIME.eq(Session.MAX_TIME),
174                        EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey()));
175
176        return getEntityInstancePKHolderFromQuery(query);
177    }
178
179    public EntityInstancePKHolder getEntityInstancePKHolderByLastName(String lastName) {
180        var query = session.getDslContext()
181                .select(EntityInstances.ENTITY_INSTANCE)
182                .from(EntityInstances)
183                .join(Parties).on(Parties.PARTY.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE))
184                .join(PartyDetails).onKey(PARTIES_ACTIVE_DETAIL_FK)
185                .join(People).onKey(PEOPLE_PARTY_FK)
186                .where(PartyDetails.PARTY_TYPE.eq(partyType.getPrimaryKey()),
187                        People.LAST_NAME.eq(lastName),
188                        People.THRU_TIME.eq(Session.MAX_TIME),
189                        EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey()));
190
191        return getEntityInstancePKHolderFromQuery(query);
192    }
193
194    public EntityInstancePKHolder getEntityInstancePKHolderByLastNameSdx(String lastNameSdx) {
195        var query = session.getDslContext()
196                .select(EntityInstances.ENTITY_INSTANCE)
197                .from(EntityInstances)
198                .join(Parties).on(Parties.PARTY.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE))
199                .join(PartyDetails).onKey(PARTIES_ACTIVE_DETAIL_FK)
200                .join(People).onKey(PEOPLE_PARTY_FK)
201                .where(PartyDetails.PARTY_TYPE.eq(partyType.getPrimaryKey()),
202                        People.LAST_NAME_SDX.eq(lastNameSdx),
203                        People.THRU_TIME.eq(Session.MAX_TIME),
204                        EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey()));
205
206        return getEntityInstancePKHolderFromQuery(query);
207    }
208
209    public EntityInstancePKHolder getEntityInstancePKHolderByAreaCode(GeoCode countryGeoCode, String areaCode) {
210        var query = session.getDslContext()
211                .select(EntityInstances.ENTITY_INSTANCE)
212                .from(EntityInstances)
213                .join(Parties).on(Parties.PARTY.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE))
214                .join(PartyDetails).onKey(PARTIES_ACTIVE_DETAIL_FK)
215                .join(PartyContactMechanismDetails).onKey(PARTY_CONTACT_MECHANISM_DETAILS_PARTY_FK)
216                .join(PartyContactMechanisms).onKey(PARTY_CONTACT_MECHANISMS_ACTIVE_DETAIL_FK)
217                .join(ContactTelephones).on(PartyContactMechanismDetails.CONTACT_MECHANISM.eq(ContactTelephones.CONTACT_MECHANISM))
218                .where(PartyDetails.PARTY_TYPE.eq(partyType.getPrimaryKey()),
219                        ContactTelephones.THRU_TIME.eq(Session.MAX_TIME),
220                        ContactTelephones.COUNTRY_GEO_CODE.eq(countryGeoCode.getPrimaryKey()),
221                        ContactTelephones.AREA_CODE.eq(areaCode),
222                        EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey()));
223
224        return getEntityInstancePKHolderFromQuery(query);
225    }
226
227    public EntityInstancePKHolder getEntityInstancePKHolderByTelephoneNumber(GeoCode countryGeoCode, String telephoneNumber) {
228        var query = session.getDslContext()
229                .select(EntityInstances.ENTITY_INSTANCE)
230                .from(EntityInstances)
231                .join(Parties).on(Parties.PARTY.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE))
232                .join(PartyDetails).onKey(PARTIES_ACTIVE_DETAIL_FK)
233                .join(PartyContactMechanismDetails).onKey(PARTY_CONTACT_MECHANISM_DETAILS_PARTY_FK)
234                .join(PartyContactMechanisms).onKey(PARTY_CONTACT_MECHANISMS_ACTIVE_DETAIL_FK)
235                .join(ContactTelephones).on(PartyContactMechanismDetails.CONTACT_MECHANISM.eq(ContactTelephones.CONTACT_MECHANISM))
236                .where(PartyDetails.PARTY_TYPE.eq(partyType.getPrimaryKey()),
237                        ContactTelephones.THRU_TIME.eq(Session.MAX_TIME),
238                        ContactTelephones.COUNTRY_GEO_CODE.eq(countryGeoCode.getPrimaryKey()),
239                        ContactTelephones.TELEPHONE_NUMBER.eq(telephoneNumber),
240                        EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey()));
241
242        return getEntityInstancePKHolderFromQuery(query);
243    }
244
245    public EntityInstancePKHolder getEntityInstancePKHolderByTelephoneExtension(GeoCode countryGeoCode, String telephoneExtension) {
246        var query = session.getDslContext()
247                .select(EntityInstances.ENTITY_INSTANCE)
248                .from(EntityInstances)
249                .join(Parties).on(Parties.PARTY.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE))
250                .join(PartyDetails).onKey(PARTIES_ACTIVE_DETAIL_FK)
251                .join(PartyContactMechanismDetails).onKey(PARTY_CONTACT_MECHANISM_DETAILS_PARTY_FK)
252                .join(PartyContactMechanisms).onKey(PARTY_CONTACT_MECHANISMS_ACTIVE_DETAIL_FK)
253                .join(ContactTelephones).on(PartyContactMechanismDetails.CONTACT_MECHANISM.eq(ContactTelephones.CONTACT_MECHANISM))
254                .where(PartyDetails.PARTY_TYPE.eq(partyType.getPrimaryKey()),
255                        ContactTelephones.THRU_TIME.eq(Session.MAX_TIME),
256                        ContactTelephones.COUNTRY_GEO_CODE.eq(countryGeoCode.getPrimaryKey()),
257                        ContactTelephones.TELEPHONE_EXTENSION.eq(telephoneExtension),
258                        EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey()));
259
260        return getEntityInstancePKHolderFromQuery(query);
261    }
262
263    public EntityInstancePKHolder getEntityInstancePKHolderByEmailAddress(String emailAddress) {
264        var query = session.getDslContext()
265                .select(EntityInstances.ENTITY_INSTANCE)
266                .from(EntityInstances)
267                .join(Parties).on(Parties.PARTY.cast(Long.class).eq(EntityInstances.ENTITY_UNIQUE))
268                .join(PartyDetails).onKey(PARTIES_ACTIVE_DETAIL_FK)
269                .join(PartyContactMechanismDetails).onKey(PARTY_CONTACT_MECHANISM_DETAILS_PARTY_FK)
270                .join(PartyContactMechanisms).onKey(PARTY_CONTACT_MECHANISMS_ACTIVE_DETAIL_FK)
271                .join(ContactEmailAddresses).on(PartyContactMechanismDetails.CONTACT_MECHANISM.eq(ContactEmailAddresses.CONTACT_MECHANISM))
272                .where(PartyDetails.PARTY_TYPE.eq(partyType.getPrimaryKey()),
273                        ContactEmailAddresses.THRU_TIME.eq(Session.MAX_TIME),
274                        ContactEmailAddresses.EMAIL_ADDRESS.eq(emailAddress),
275                        EntityInstances.ENTITY_TYPE.eq(entityType.getPrimaryKey()));
276
277        return getEntityInstancePKHolderFromQuery(query);
278    }
279
280    public String getFirstName() {
281        return firstName;
282    }
283    
284    public void setFirstName(String firstName) {
285        this.firstName = firstName;
286    }
287    
288    public Boolean getFirstNameSoundex() {
289        return firstNameSoundex;
290    }
291    
292    public void setFirstNameSoundex(Boolean firstNameSoundex) {
293        this.firstNameSoundex = firstNameSoundex;
294    }
295    
296    public String getMiddleName() {
297        return middleName;
298    }
299    
300    public void setMiddleName(String middleName) {
301        this.middleName = middleName;
302    }
303    
304    public Boolean getMiddleNameSoundex() {
305        return middleNameSoundex;
306    }
307    
308    public void setMiddleNameSoundex(Boolean middleNameSoundex) {
309        this.middleNameSoundex = middleNameSoundex;
310    }
311    
312    public String getLastName() {
313        return lastName;
314    }
315    
316    public void setLastName(String lastName) {
317        this.lastName = lastName;
318    }
319    
320    public Boolean getLastNameSoundex() {
321        return lastNameSoundex;
322    }
323    
324    public void setLastNameSoundex(Boolean lastNameSoundex) {
325        this.lastNameSoundex = lastNameSoundex;
326    }
327    
328    public String getPartyName() {
329        return partyName;
330    }
331
332    public GeoCode getCountryGeoCode() {
333        return countryGeoCode;
334    }
335
336    public void setCountryGeoCode(GeoCode countryGeoCode) {
337        this.countryGeoCode = countryGeoCode;
338    }
339
340    public String getAreaCode() {
341        return areaCode;
342    }
343
344    public void setAreaCode(String areaCode) {
345        this.areaCode = areaCode;
346    }
347
348    public String getTelephoneNumber() {
349        return telephoneNumber;
350    }
351
352    public void setTelephoneNumber(String telephoneNumber) {
353        this.telephoneNumber = telephoneNumber;
354    }
355
356    public String getTelephoneExtension() {
357        return telephoneExtension;
358    }
359
360    public void setTelephoneExtension(String telephoneExtension) {
361        this.telephoneExtension = telephoneExtension;
362    }
363
364    public String getEmailAddress() {
365        return emailAddress;
366    }
367
368    public void setEmailAddress(String emailAddress) {
369        this.emailAddress = emailAddress;
370    }
371    
372    public void setPartyName(String partyName) {
373        this.partyName = partyName;
374    }
375
376    public PartyAliasType getPartyAliasType() {
377        return partyAliasType;
378    }
379
380    public void setPartyAliasType(PartyAliasType partyAliasType) {
381        this.partyAliasType = partyAliasType;
382    }
383
384    public String getAlias() {
385        return alias;
386    }
387
388    public void setAlias(String alias) {
389        this.alias = alias;
390    }
391
392    @Override
393    public BasicAnalyzer getAnalyzer(final ExecutionErrorAccumulator eea, final Language language) {
394        return new PartyAnalyzer(eea, language, entityType, partyType, entityNameIndexField);
395    }
396
397    /** Subclasses should override and always call their super's executeSearch() */
398    @Override
399    protected EntityInstancePKHolder executeSearch(final ExecutionErrorAccumulator eea) {
400        EntityInstancePKHolder resultSet = null;
401        var parameterCount = (partyName == null ? 0 : 1) + (alias == null ? 0 : 1);
402
403        if(parameterCount == 0) {
404            resultSet = super.executeSearch(eea);
405            
406            if(resultSet == null || resultSet.size() > 0) {
407                if(firstName != null) {
408                    if(firstNameSoundex) {
409                        String firstNameSdx;
410
411                        try {
412                            firstNameSdx = firstName == null? null: getSoundex().encode(firstName);
413                        } catch (IllegalArgumentException iae) {
414                            firstNameSdx = null;
415                        }
416
417                        if(firstNameSdx != null) {
418                            var entityInstancePKHolder = getEntityInstancePKHolderByFirstNameSdx(firstNameSdx);
419
420                            if(resultSet == null) {
421                                resultSet = entityInstancePKHolder;
422                            } else {
423                                resultSet.retainAll(entityInstancePKHolder);
424                            }
425                        } else {
426                            resultSet = null;
427                        }
428                    } else {
429                        var entityInstancePKHolder = getEntityInstancePKHolderByFirstName(firstName);
430
431                        if(resultSet == null) {
432                            resultSet = entityInstancePKHolder;
433                        } else {
434                            resultSet.retainAll(entityInstancePKHolder);
435                        }
436                    }
437                }
438            }
439
440            if(resultSet == null || resultSet.size() > 0) {
441                if(middleName != null) {
442                    if(middleNameSoundex) {
443                        String middleNameSdx;
444
445                        try {
446                            middleNameSdx = middleName == null? null: getSoundex().encode(middleName);
447                        } catch (IllegalArgumentException iae) {
448                            middleNameSdx = null;
449                        }
450
451                        if(middleNameSdx != null) {
452                            var entityInstancePKHolder = getEntityInstancePKHolderByMiddleNameSdx(middleNameSdx);
453
454                            if(resultSet == null) {
455                                resultSet = entityInstancePKHolder;
456                            } else {
457                                resultSet.retainAll(entityInstancePKHolder);
458                            }
459                        } else {
460                            resultSet = null;
461                        }
462                    } else {
463                        var entityInstancePKHolder = getEntityInstancePKHolderByMiddleName(middleName);
464
465                        if(resultSet == null) {
466                            resultSet = entityInstancePKHolder;
467                        } else {
468                            resultSet.retainAll(entityInstancePKHolder);
469                        }
470                    }
471                }
472            }
473
474            if(resultSet == null || resultSet.size() > 0) {
475                if(lastName != null) {
476                    if(lastNameSoundex) {
477                        String lastNameSdx;
478
479                        try {
480                            lastNameSdx = lastName == null? null: getSoundex().encode(lastName);
481                        } catch (IllegalArgumentException iae) {
482                            lastNameSdx = null;
483                        }
484
485                        if(lastNameSdx != null) {
486                            var entityInstancePKHolder = getEntityInstancePKHolderByLastNameSdx(lastNameSdx);
487
488                            if(resultSet == null) {
489                                resultSet = entityInstancePKHolder;
490                            } else {
491                                resultSet.retainAll(entityInstancePKHolder);
492                            }
493                        } else {
494                            resultSet = null;
495                        }
496                    } else {
497                        var entityInstancePKHolder = getEntityInstancePKHolderByLastName(lastName);
498
499                        if(resultSet == null) {
500                            resultSet = entityInstancePKHolder;
501                        } else {
502                            resultSet.retainAll(entityInstancePKHolder);
503                        }
504                    }
505                }
506            }
507
508            if(countryGeoCode != null && areaCode != null && (resultSet == null || resultSet.size() > 0)) {
509                var entityInstancePKHolder = getEntityInstancePKHolderByAreaCode(countryGeoCode, areaCode);
510
511                if(resultSet == null) {
512                    resultSet = entityInstancePKHolder;
513                } else {
514                    resultSet.retainAll(entityInstancePKHolder);
515                }
516            }
517            
518            if(countryGeoCode != null && telephoneNumber != null && (resultSet == null || resultSet.size() > 0)) {
519                var entityInstancePKHolder = getEntityInstancePKHolderByTelephoneNumber(countryGeoCode, telephoneNumber);
520
521                if(resultSet == null) {
522                    resultSet = entityInstancePKHolder;
523                } else {
524                    resultSet.retainAll(entityInstancePKHolder);
525                }
526            }
527            
528            if(countryGeoCode != null && telephoneExtension != null && (resultSet == null || resultSet.size() > 0)) {
529                var entityInstancePKHolder = getEntityInstancePKHolderByTelephoneExtension(countryGeoCode, telephoneExtension);
530
531                if(resultSet == null) {
532                    resultSet = entityInstancePKHolder;
533                } else {
534                    resultSet.retainAll(entityInstancePKHolder);
535                }
536            }
537            
538            if(emailAddress != null && (resultSet == null || resultSet.size() > 0)) {
539                var entityInstancePKHolder = getEntityInstancePKHolderByEmailAddress(emailAddress);
540
541                if(resultSet == null) {
542                    resultSet = entityInstancePKHolder;
543                } else {
544                    resultSet.retainAll(entityInstancePKHolder);
545                }
546            }
547            
548            if(resultSet == null || resultSet.size() > 0) {
549                if(q != null) {
550                    var entityInstancePKHolder = executeQuery(eea);
551                    
552                    if(resultSet == null) {
553                        resultSet = entityInstancePKHolder;
554                    } else {
555                        resultSet.retainAll(entityInstancePKHolder);
556                    }
557                }
558            }
559        } else {
560            if(parameterCount == 1) {
561                var partyControl = Session.getModelController(PartyControl.class);
562                Party party = null;
563
564                if(alias != null) {
565                    if(partyAliasType == null) {
566                        partyAliasType = partyControl.getDefaultPartyAliasType(partyType);
567                    }
568                    
569                    if(partyAliasType != null) {
570                        party = partyControl.getPartyByAlias(partyAliasType, alias);
571                    }
572                }
573
574                if(partyName != null) {
575                    party = partyControl.getPartyByName(partyName);
576
577                    // If it isn't the PartyType we're looking for, toss the Party away.
578                    if(!party.getLastDetail().getPartyType().equals(partyType)) {
579                        party = null;
580                    }
581                }
582
583                if(party != null) {
584                    var entityInstanceControl = Session.getModelController(EntityInstanceControl.class);
585
586                    resultSet = new EntityInstancePKHolder(1);
587                    resultSet.add(entityInstanceControl.getEntityInstanceByBasePK(party.getPrimaryKey()).getPrimaryKey(), null);
588                }
589            }
590        }
591        
592        return resultSet;
593    }
594
595}