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}