001/*-
002 * #%L
003 * HAPI FHIR JPA Server
004 * %%
005 * Copyright (C) 2014 - 2025 Smile CDR, Inc.
006 * %%
007 * Licensed under the Apache License, Version 2.0 (the "License");
008 * you may not use this file except in compliance with the License.
009 * You may obtain a copy of the License at
010 *
011 *      http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing, software
014 * distributed under the License is distributed on an "AS IS" BASIS,
015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016 * See the License for the specific language governing permissions and
017 * limitations under the License.
018 * #L%
019 */
020package ca.uhn.fhir.jpa.search.builder.sql;
021
022import ca.uhn.fhir.jpa.search.builder.QueryStack;
023import ca.uhn.fhir.jpa.search.builder.predicate.ComboNonUniqueSearchParameterPredicateBuilder;
024import ca.uhn.fhir.jpa.search.builder.predicate.ComboUniqueSearchParameterPredicateBuilder;
025import ca.uhn.fhir.jpa.search.builder.predicate.CoordsPredicateBuilder;
026import ca.uhn.fhir.jpa.search.builder.predicate.DatePredicateBuilder;
027import ca.uhn.fhir.jpa.search.builder.predicate.NumberPredicateBuilder;
028import ca.uhn.fhir.jpa.search.builder.predicate.QuantityNormalizedPredicateBuilder;
029import ca.uhn.fhir.jpa.search.builder.predicate.QuantityPredicateBuilder;
030import ca.uhn.fhir.jpa.search.builder.predicate.ResourceHistoryPredicateBuilder;
031import ca.uhn.fhir.jpa.search.builder.predicate.ResourceHistoryProvenancePredicateBuilder;
032import ca.uhn.fhir.jpa.search.builder.predicate.ResourceIdPredicateBuilder;
033import ca.uhn.fhir.jpa.search.builder.predicate.ResourceLinkPredicateBuilder;
034import ca.uhn.fhir.jpa.search.builder.predicate.ResourceTablePredicateBuilder;
035import ca.uhn.fhir.jpa.search.builder.predicate.SearchParamPresentPredicateBuilder;
036import ca.uhn.fhir.jpa.search.builder.predicate.StringPredicateBuilder;
037import ca.uhn.fhir.jpa.search.builder.predicate.TagPredicateBuilder;
038import ca.uhn.fhir.jpa.search.builder.predicate.TokenPredicateBuilder;
039import ca.uhn.fhir.jpa.search.builder.predicate.UriPredicateBuilder;
040import ca.uhn.fhir.rest.api.SearchIncludeDeletedEnum;
041import org.springframework.beans.factory.annotation.Autowired;
042import org.springframework.context.ApplicationContext;
043
044import java.util.Objects;
045
046public class SqlObjectFactory {
047
048        @Autowired
049        private ApplicationContext myApplicationContext;
050
051        public ComboUniqueSearchParameterPredicateBuilder newComboUniqueSearchParameterPredicateBuilder(
052                        SearchQueryBuilder theSearchSqlBuilder) {
053                return myApplicationContext.getBean(ComboUniqueSearchParameterPredicateBuilder.class, theSearchSqlBuilder);
054        }
055
056        public ComboNonUniqueSearchParameterPredicateBuilder newComboNonUniqueSearchParameterPredicateBuilder(
057                        SearchQueryBuilder theSearchSqlBuilder) {
058                return myApplicationContext.getBean(ComboNonUniqueSearchParameterPredicateBuilder.class, theSearchSqlBuilder);
059        }
060
061        public CoordsPredicateBuilder coordsPredicateBuilder(SearchQueryBuilder theSearchSqlBuilder) {
062                return myApplicationContext.getBean(CoordsPredicateBuilder.class, theSearchSqlBuilder);
063        }
064
065        public DatePredicateBuilder dateIndexTable(SearchQueryBuilder theSearchSqlBuilder) {
066                return myApplicationContext.getBean(DatePredicateBuilder.class, theSearchSqlBuilder);
067        }
068
069        public NumberPredicateBuilder numberIndexTable(SearchQueryBuilder theSearchSqlBuilder) {
070                return myApplicationContext.getBean(NumberPredicateBuilder.class, theSearchSqlBuilder);
071        }
072
073        public QuantityPredicateBuilder quantityIndexTable(SearchQueryBuilder theSearchSqlBuilder) {
074                return myApplicationContext.getBean(QuantityPredicateBuilder.class, theSearchSqlBuilder);
075        }
076
077        public QuantityNormalizedPredicateBuilder quantityNormalizedIndexTable(SearchQueryBuilder theSearchSqlBuilder) {
078                return myApplicationContext.getBean(QuantityNormalizedPredicateBuilder.class, theSearchSqlBuilder);
079        }
080
081        public ResourceLinkPredicateBuilder referenceIndexTable(
082                        QueryStack theQueryStack, SearchQueryBuilder theSearchSqlBuilder, boolean theReversed) {
083                return myApplicationContext.getBean(
084                                ResourceLinkPredicateBuilder.class, theQueryStack, theSearchSqlBuilder, theReversed);
085        }
086
087        public ResourceTablePredicateBuilder resourceTable(
088                        SearchQueryBuilder theSearchSqlBuilder, SearchIncludeDeletedEnum theSearchIncludeDeleted) {
089                // the default is searching non-deleted resources
090                return myApplicationContext.getBean(
091                                ResourceTablePredicateBuilder.class,
092                                theSearchSqlBuilder,
093                                Objects.requireNonNullElse(theSearchIncludeDeleted, SearchIncludeDeletedEnum.NEVER));
094        }
095
096        public ResourceIdPredicateBuilder resourceId(SearchQueryBuilder theSearchSqlBuilder) {
097                return myApplicationContext.getBean(ResourceIdPredicateBuilder.class, theSearchSqlBuilder);
098        }
099
100        public SearchParamPresentPredicateBuilder searchParamPresentPredicateBuilder(
101                        SearchQueryBuilder theSearchSqlBuilder) {
102                return myApplicationContext.getBean(SearchParamPresentPredicateBuilder.class, theSearchSqlBuilder);
103        }
104
105        public StringPredicateBuilder stringIndexTable(SearchQueryBuilder theSearchSqlBuilder) {
106                return myApplicationContext.getBean(StringPredicateBuilder.class, theSearchSqlBuilder);
107        }
108
109        public TokenPredicateBuilder tokenIndexTable(SearchQueryBuilder theSearchSqlBuilder) {
110                return myApplicationContext.getBean(TokenPredicateBuilder.class, theSearchSqlBuilder);
111        }
112
113        public UriPredicateBuilder uriIndexTable(SearchQueryBuilder theSearchSqlBuilder) {
114                return myApplicationContext.getBean(UriPredicateBuilder.class, theSearchSqlBuilder);
115        }
116
117        public TagPredicateBuilder newTagPredicateBuilder(SearchQueryBuilder theSearchSqlBuilder) {
118                return myApplicationContext.getBean(TagPredicateBuilder.class, theSearchSqlBuilder);
119        }
120
121        public ResourceHistoryPredicateBuilder newResourceHistoryPredicateBuilder(SearchQueryBuilder theSearchSqlBuilder) {
122                return myApplicationContext.getBean(ResourceHistoryPredicateBuilder.class, theSearchSqlBuilder);
123        }
124
125        public ResourceHistoryProvenancePredicateBuilder newResourceHistoryProvenancePredicateBuilder(
126                        SearchQueryBuilder theSearchSqlBuilder) {
127                return myApplicationContext.getBean(ResourceHistoryProvenancePredicateBuilder.class, theSearchSqlBuilder);
128        }
129
130        public SearchQueryExecutor newSearchQueryExecutor(GeneratedSql theGeneratedSql, Integer theMaxResultsToFetch) {
131                return myApplicationContext.getBean(SearchQueryExecutor.class, theGeneratedSql, theMaxResultsToFetch);
132        }
133}