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.predicate;
021
022import ca.uhn.fhir.jpa.model.entity.ResourceTable;
023import ca.uhn.fhir.jpa.search.builder.sql.SearchQueryBuilder;
024import ca.uhn.fhir.jpa.util.QueryParameterUtils;
025import ca.uhn.fhir.rest.api.SearchIncludeDeletedEnum;
026import com.healthmarketscience.sqlbuilder.BinaryCondition;
027import com.healthmarketscience.sqlbuilder.Condition;
028import com.healthmarketscience.sqlbuilder.NotCondition;
029import com.healthmarketscience.sqlbuilder.UnaryCondition;
030import com.healthmarketscience.sqlbuilder.dbspec.basic.DbColumn;
031
032import java.util.Set;
033
034public class ResourceTablePredicateBuilder extends BaseJoiningPredicateBuilder {
035        private final DbColumn myColumnResId;
036        private final DbColumn myColumnResDeletedAt;
037        private final DbColumn myColumnResType;
038        private final DbColumn myColumnLastUpdated;
039        private final DbColumn myColumnLanguage;
040        private final DbColumn myColumnFhirId;
041        private final SearchIncludeDeletedEnum mySearchIncludeDeleted;
042
043        /**
044         * Constructor
045         */
046        public ResourceTablePredicateBuilder(
047                        SearchQueryBuilder theSearchSqlBuilder, SearchIncludeDeletedEnum theSearchIncludeDeleted) {
048                super(theSearchSqlBuilder, theSearchSqlBuilder.addTable("HFJ_RESOURCE"));
049                myColumnResId = getTable().addColumn("RES_ID");
050                myColumnResType = getTable().addColumn(ResourceTable.RES_TYPE);
051                myColumnResDeletedAt = getTable().addColumn("RES_DELETED_AT");
052                myColumnLastUpdated = getTable().addColumn("RES_UPDATED");
053                myColumnLanguage = getTable().addColumn("RES_LANGUAGE");
054                myColumnFhirId = getTable().addColumn(ResourceTable.FHIR_ID);
055
056                mySearchIncludeDeleted = theSearchIncludeDeleted;
057        }
058
059        @Override
060        public DbColumn getResourceIdColumn() {
061                return myColumnResId;
062        }
063
064        public Condition createResourceTypeAndNonDeletedPredicates() {
065                BinaryCondition typePredicate = createResourceTypePredicate();
066                return QueryParameterUtils.toAndPredicate(typePredicate, UnaryCondition.isNull(myColumnResDeletedAt));
067        }
068
069        public Condition createResourceTypeAndDeletedPredicates() {
070                BinaryCondition typePredicate = createResourceTypePredicate();
071
072                return QueryParameterUtils.toAndPredicate(typePredicate, UnaryCondition.isNotNull(myColumnResDeletedAt));
073        }
074
075        public BinaryCondition createResourceTypePredicate() {
076                BinaryCondition typePredicate = null;
077                if (getResourceType() != null) {
078                        typePredicate = BinaryCondition.equalTo(myColumnResType, generatePlaceholder(getResourceType()));
079                }
080
081                return typePredicate;
082        }
083
084        public DbColumn getLastUpdatedColumn() {
085                return myColumnLastUpdated;
086        }
087
088        public Condition createLanguagePredicate(Set<String> theValues, boolean theNegated) {
089                Condition condition =
090                                QueryParameterUtils.toEqualToOrInPredicate(myColumnLanguage, generatePlaceholders(theValues));
091                if (theNegated) {
092                        condition = new NotCondition(condition);
093                }
094                return condition;
095        }
096
097        public DbColumn getColumnLastUpdated() {
098                return myColumnLastUpdated;
099        }
100
101        public DbColumn getColumnFhirId() {
102                return myColumnFhirId;
103        }
104
105        public DbColumn getResourceTypeColumn() {
106                return myColumnResType;
107        }
108
109        public SearchIncludeDeletedEnum getSearchIncludeDeleted() {
110                return mySearchIncludeDeleted;
111        }
112}