001/*-
002 * #%L
003 * HAPI FHIR - Core Library
004 * %%
005 * Copyright (C) 2014 - 2026 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.repository;
021
022import ca.uhn.fhir.model.api.IQueryParameterType;
023import ca.uhn.fhir.rest.param.NumberParam;
024import com.google.common.collect.Multimap;
025
026import java.util.List;
027import java.util.Map;
028
029/**
030 * Abstract interface for building a repository rest query.
031 */
032public interface IRepositoryRestQueryBuilder {
033
034        /**
035         * The main method for implementations to add a parameter to the query.
036         * @param theParamName the search parameter name, without modifiers.  E.g. "name", or "_sort"
037         * @param theParameters a list of parameters - this is the comma-separated list after the "=" in a rest query.
038         * @return this for chaining
039         */
040        IRepositoryRestQueryBuilder addOrList(String theParamName, List<IQueryParameterType> theParameters);
041
042        default IRepositoryRestQueryBuilder addOrList(String theParamName, IQueryParameterType... theParameterValues) {
043                return addOrList(theParamName, List.of(theParameterValues));
044        }
045
046        default IRepositoryRestQueryBuilder addNumericParameter(String theParamName, int theValue) {
047                return addOrList(theParamName, new NumberParam(theValue));
048        }
049
050        default IRepositoryRestQueryBuilder addAll(Multimap<String, List<IQueryParameterType>> theSearchParameters) {
051                theSearchParameters.entries().forEach(e -> this.addOrList(e.getKey(), e.getValue()));
052                return this;
053        }
054
055        default IRepositoryRestQueryBuilder addAll(Map<String, List<IQueryParameterType>> theSearchParameters) {
056                theSearchParameters.forEach(this::addOrList);
057                return this;
058        }
059}