001/*
002 * Licensed under the Apache License, Version 2.0 (the "License");
003 * you may not use this file except in compliance with the License.
004 * You may obtain a copy of the License at
005 *
006 *     http://www.apache.org/licenses/LICENSE-2.0
007 *
008 * Unless required by applicable law or agreed to in writing, software
009 * distributed under the License is distributed on an "AS IS" BASIS,
010 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
011 * See the License for the specific language governing permissions and
012 * limitations under the License.
013 */
014package org.gbif.api.model.occurrence.search;
015
016import java.util.Date;
017import java.util.Optional;
018import java.util.UUID;
019
020import io.swagger.v3.oas.annotations.Hidden;
021
022import org.gbif.api.annotation.Experimental;
023import org.gbif.api.model.common.paging.Pageable;
024import org.gbif.api.model.common.search.FacetedSearchRequest;
025import org.gbif.api.util.IsoDateInterval;
026import org.gbif.api.vocabulary.BasisOfRecord;
027import org.gbif.api.vocabulary.Continent;
028import org.gbif.api.vocabulary.Country;
029import org.gbif.api.vocabulary.MediaType;
030import org.gbif.api.vocabulary.OccurrenceIssue;
031import org.gbif.api.vocabulary.OccurrenceStatus;
032
033/** Request class for issuing search request to the occurrence search service. */
034public class OccurrenceSearchRequest extends FacetedSearchRequest<OccurrenceSearchParameter> {
035
036  @Hidden
037  private Boolean matchCase;
038
039  @Hidden
040  private String shuffle;
041
042  /**
043   * This flag enables the use of case-sensitive matches and aggregations on certain search
044   * parameters.
045   *
046   * <p>Fields that support this feature are: occurrenceId, recordedBy, samplingProtocol,
047   * catalogNumber, collectionCode, institutionCode, eventId, parentEventId, waterBody,
048   * stateProvince, recordNumber, identifiedBy, organismId and locality.
049   *
050   * <p>This is an experimental feature, and its implementation may change or be removed at any time.
051   *
052   * <p>Be aware that this is not a per-field flag, all possible fields will match case sensitively.
053   */
054  @Experimental
055  public Boolean isMatchCase() {
056    return Optional.ofNullable(matchCase).orElse(Boolean.FALSE);
057  }
058
059  @Experimental
060  public void setMatchCase(Boolean matchCase) {
061    this.matchCase = matchCase;
062  }
063
064  /**
065   * This flag allows to sort the results in a random order by specifying a seed. The seed makes the
066   * random results reproducible so we can use paging. The same seed has to be sent for each page.
067   */
068  @Experimental
069  public String getShuffle() {
070    return shuffle;
071  }
072
073  @Experimental
074  public void setShuffle(String shuffle) {
075    this.shuffle = shuffle;
076  }
077
078  public OccurrenceSearchRequest(Pageable page) {
079    super(page);
080  }
081
082  public OccurrenceSearchRequest() {
083  }
084
085  public void addOccurrenceIDFilter(String occurrenceID) {
086    addParameter(OccurrenceSearchParameter.OCCURRENCE_ID, occurrenceID);
087  }
088
089  public void addEstablishmentMeansFilter(String establishmentMeans) {
090    addParameter(OccurrenceSearchParameter.ESTABLISHMENT_MEANS, establishmentMeans);
091  }
092
093  public void addBasisOfRecordFilter(BasisOfRecord basisOfRecord) {
094    addParameter(OccurrenceSearchParameter.BASIS_OF_RECORD, basisOfRecord);
095  }
096
097  public void addTypeStatusFilter(String typeStatus) {
098    addParameter(OccurrenceSearchParameter.TYPE_STATUS, typeStatus);
099  }
100
101  public void addCatalogNumberFilter(String catalogNumber) {
102    addParameter(OccurrenceSearchParameter.CATALOG_NUMBER, catalogNumber);
103  }
104
105  public void addRecordedByFilter(String collectorName) {
106    addParameter(OccurrenceSearchParameter.RECORDED_BY, collectorName);
107  }
108
109  public void addIdentifiedByFilter(String collectorName) {
110    addParameter(OccurrenceSearchParameter.IDENTIFIED_BY, collectorName);
111  }
112
113  public void addRecordNumberFilter(String recordNumber) {
114    addParameter(OccurrenceSearchParameter.RECORD_NUMBER, recordNumber);
115  }
116
117  public void addCountryFilter(Country country) {
118    addParameter(OccurrenceSearchParameter.COUNTRY, country.getIso2LetterCode());
119  }
120
121  public void addContinentFilter(Continent continent) {
122    addParameter(OccurrenceSearchParameter.CONTINENT, continent);
123  }
124
125  public void addDatasetKeyFilter(UUID datasetKey) {
126    addParameter(OccurrenceSearchParameter.DATASET_KEY, datasetKey.toString());
127  }
128
129  public void addGeometryFilter(String geometryAsWkt) {
130    addParameter(OccurrenceSearchParameter.GEOMETRY, geometryAsWkt);
131  }
132
133  public void addDecimalLatitudeFilter(double latitude) {
134    addParameter(OccurrenceSearchParameter.DECIMAL_LATITUDE, latitude);
135  }
136
137  public void addDecimalLongitudeFilter(double longitude) {
138    addParameter(OccurrenceSearchParameter.DECIMAL_LONGITUDE, longitude);
139  }
140
141  public void addCoordinateUncertaintyInMetersFilter(double uncertainty) {
142    addParameter(OccurrenceSearchParameter.COORDINATE_UNCERTAINTY_IN_METERS, uncertainty);
143  }
144
145  public void addMonthFilter(int month) {
146    addParameter(OccurrenceSearchParameter.MONTH, month);
147  }
148
149  public void addDayFilter(int day) {
150    addParameter(OccurrenceSearchParameter.DAY, day);
151  }
152
153  public void addTaxonKeyFilter(String taxonKey) {
154    addParameter(OccurrenceSearchParameter.TAXON_KEY, taxonKey);
155  }
156
157  public void addKingdomKeyFilter(String kingdomKey) {
158    addParameter(OccurrenceSearchParameter.KINGDOM_KEY, kingdomKey);
159  }
160
161  public void addPhylumKeyFilter(String phylumKey) {
162    addParameter(OccurrenceSearchParameter.PHYLUM_KEY, phylumKey);
163  }
164
165  public void addClassKeyFilter(String classKey) {
166    addParameter(OccurrenceSearchParameter.CLASS_KEY, classKey);
167  }
168
169  public void addOrderKeyFilter(String orderKey) {
170    addParameter(OccurrenceSearchParameter.ORDER_KEY, orderKey);
171  }
172
173  public void addFamilyKeyFilter(String familyKey) {
174    addParameter(OccurrenceSearchParameter.FAMILY_KEY, familyKey);
175  }
176
177  public void addGenusKeyFilter(String genusKey) {
178    addParameter(OccurrenceSearchParameter.GENUS_KEY, genusKey);
179  }
180
181  public void addSubGenusKeyFilter(String subGenusKey) {
182    addParameter(OccurrenceSearchParameter.SUBGENUS_KEY, subGenusKey);
183  }
184
185  public void addSpeciesKeyFilter(String speciesKey) {
186    addParameter(OccurrenceSearchParameter.SPECIES_KEY, speciesKey);
187  }
188
189  public void addYearFilter(int year) {
190    addParameter(OccurrenceSearchParameter.YEAR, year);
191  }
192
193  public void addEventDateFilter(IsoDateInterval date) {
194    addParameter(OccurrenceSearchParameter.EVENT_DATE, date);
195  }
196
197  public void addLastInterpretedFilter(Date modified) {
198    addParameter(OccurrenceSearchParameter.LAST_INTERPRETED, modified);
199  }
200
201  public void addPublishingCountryFilter(Country country) {
202    addParameter(OccurrenceSearchParameter.PUBLISHING_COUNTRY, country.getIso2LetterCode());
203  }
204
205  public void addInstitutionCodeFilter(String code) {
206    addParameter(OccurrenceSearchParameter.INSTITUTION_CODE, code);
207  }
208
209  public void addHasCoordinateFilter(boolean hasCoordinate) {
210    addParameter(OccurrenceSearchParameter.HAS_COORDINATE, hasCoordinate);
211  }
212
213  public void addSpatialIssueFilter(boolean hasSpatialIssue) {
214    addParameter(OccurrenceSearchParameter.HAS_GEOSPATIAL_ISSUE, hasSpatialIssue);
215  }
216
217  public void addIssueFilter(OccurrenceIssue issue) {
218    addParameter(OccurrenceSearchParameter.ISSUE, issue);
219  }
220
221  public void addElevationFilter(double elevation) {
222    addParameter(OccurrenceSearchParameter.ELEVATION, elevation);
223  }
224
225  public void addMediaTypeFilter(MediaType mediaType) {
226    addParameter(OccurrenceSearchParameter.MEDIA_TYPE, mediaType);
227  }
228
229  public void addRecordedByIdsFilter(String recordedByIds) {
230    addParameter(OccurrenceSearchParameter.RECORDED_BY_ID, recordedByIds);
231  }
232
233  public void addIdentifiedByIdsFilter(String identifiedByIds) {
234    addParameter(OccurrenceSearchParameter.IDENTIFIED_BY_ID, identifiedByIds);
235  }
236
237  public void addOccurrenceStatusFilter(OccurrenceStatus occurrenceStatus) {
238    addParameter(OccurrenceSearchParameter.OCCURRENCE_STATUS, occurrenceStatus);
239  }
240
241  public void addGadmGidFilter(String gadmGid) {
242    addParameter(OccurrenceSearchParameter.GADM_GID, gadmGid);
243  }
244
245  public void addGadmLevel0GidFilter(String gadm0) {
246    addParameter(OccurrenceSearchParameter.GADM_LEVEL_0_GID, gadm0);
247  }
248
249  public void addGadmLevel1GidFilter(String gadm1) {
250    addParameter(OccurrenceSearchParameter.GADM_LEVEL_1_GID, gadm1);
251  }
252
253  public void addGadmLevel2GidFilter(String gadm2) {
254    addParameter(OccurrenceSearchParameter.GADM_LEVEL_2_GID, gadm2);
255  }
256
257  public void addGadmLevel3GidFilter(String gadm3) {
258    addParameter(OccurrenceSearchParameter.GADM_LEVEL_3_GID, gadm3);
259  }
260
261  public void addGeologicalTimeFilter(String geologicalTimeConcept) {
262    addParameter(OccurrenceSearchParameter.GEOLOGICAL_TIME, geologicalTimeConcept);
263  }
264
265  public void addLithostratigraphyFilter(String lithostratigraphy) {
266    addParameter(OccurrenceSearchParameter.LITHOSTRATIGRAPHY, lithostratigraphy);
267  }
268
269  public void addBiostratigraphyFilter(String biostratigraphy) {
270    addParameter(OccurrenceSearchParameter.BIOSTRATIGRAPHY, biostratigraphy);
271  }
272
273  @Experimental
274  public void addInstitutionKeyFilter(String institutionKey) {
275    addParameter(OccurrenceSearchParameter.INSTITUTION_KEY, institutionKey);
276  }
277
278  @Experimental
279  public void addCollectionKeyFilter(String collectionKey) {
280    addParameter(OccurrenceSearchParameter.COLLECTION_KEY, collectionKey);
281  }
282
283  public void addDnaSequenceIDFilter(String dnaSequenceID) {
284    addParameter(OccurrenceSearchParameter.DNA_SEQUENCE_ID, dnaSequenceID);
285  }
286
287  @Experimental
288  public void addChecklistKeyFilter(String checklistKey) {
289    addParameter(OccurrenceSearchParameter.CHECKLIST_KEY, checklistKey);
290  }
291
292  @Experimental
293  public void addTaxonomicIssueFilter(String taxonomicIssue) {
294    addParameter(OccurrenceSearchParameter.TAXONOMIC_ISSUE, taxonomicIssue);
295  }
296}