Commit 0c6d6f8e authored by Matija Obreza's avatar Matija Obreza

Merge branch '402-filter-by-worldclim-data' into 'master'

Resolve "Filter by WorldClim data"

Closes #402

See merge request genesys-pgr/genesys-server!328
parents 553f019e 6d406e72
......@@ -201,7 +201,7 @@ public class ElasticQueryBuilder implements Visitor<Void, Void> {
private void handleEquals(Path<?> path, Expression<?> value) {
PathMetadata pmd = path.getMetadata();
if (pmd.getPathType() == PathType.COLLECTION_ANY) {
LOG.error("Path ANY for {}={}", pmd.getParent(), value);
LOG.debug("Path ANY for {}={}", pmd.getParent(), value);
mustClauses.add(termsQuery(customizedPath(pmd.getParent().toString()), toValues(value)));
} else {
mustClauses.add(termsQuery(customizedPath(getParentPath(pmd.getParent()) + "." + pmd.getName()), toValues(value)));
......
......@@ -57,6 +57,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import com.fasterxml.jackson.annotation.JsonView;
import com.querydsl.core.annotations.QueryInit;
@MappedSuperclass
public abstract class AccessionData extends AuditedVersionedModel implements IdUUID, AccessionIdentifier3, Serializable, SelfCleaning {
......@@ -68,6 +69,7 @@ public abstract class AccessionData extends AuditedVersionedModel implements IdU
@JoinColumn(name = "id")
@JsonUnwrapped
@Field(type=FieldType.Auto)
@QueryInit({ "geo.*", "coll.*" })
private AccessionId accessionId;
@Column(name = "doi")
......@@ -88,7 +90,7 @@ public abstract class AccessionData extends AuditedVersionedModel implements IdU
@JsonView({ JsonViews.Minimal.class })
@Field(type = FieldType.Object)
@JsonIgnoreProperties({"settings"})
// @QueryInit({ "country.region.*" })
@QueryInit({ "country.*" })
private FaoInstitute institute;
@Size(max = 128)
......
......@@ -17,9 +17,12 @@
package org.genesys2.server.model.genesys;
import javax.persistence.Column;
import javax.persistence.ConstraintMode;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Index;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
......@@ -29,9 +32,13 @@ import javax.persistence.Version;
import org.apache.commons.lang3.StringUtils;
import org.genesys.blocks.auditlog.annotations.Audited;
import org.genesys.blocks.model.BasicModel;
import org.genesys.blocks.model.JsonViews;
import org.genesys.blocks.model.SelfCleaning;
import org.genesys.worldclim.WorldClimUtil;
import org.genesys2.server.model.impl.GeoReferencedEntity;
import org.genesys2.server.model.impl.TileClimate;
import com.fasterxml.jackson.annotation.JsonView;
@Entity
@Table(name = "accession_geo", indexes = { @Index(unique = false, columnList = "latitude, longitude"), @Index(unique = false, columnList = "tileIndex") })
......@@ -60,6 +67,11 @@ public class AccessionGeo extends BasicModel implements GeoReferencedEntity, Acc
private String method;
private Long tileIndex;
@ManyToOne(cascade = {}, fetch = FetchType.LAZY, optional = true)
@JoinColumn(name = "tileIndex", nullable = true, insertable = false, updatable = false, foreignKey = @javax.persistence.ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
@JsonView({ JsonViews.Protected.class })
private TileClimate climate;
/**
* Recalculate {@link #tileIndex} on insert and update
......@@ -158,6 +170,14 @@ public class AccessionGeo extends BasicModel implements GeoReferencedEntity, Acc
public void setTileIndex(final Long tileIndex) {
this.tileIndex = tileIndex;
}
public TileClimate getClimate() {
return climate;
}
public void setClimate(TileClimate climate) {
this.climate = climate;
}
public boolean isEmpty() {
if (StringUtils.isNotBlank(datum)) {
......
This diff is collapsed.
......@@ -12,7 +12,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
*/
public class WorldclimJson {
// Monthlies
private Long[] precipitation = new Long[12];
private Double[] precipitation = new Double[12];
private Double[] tempMin = new Double[12];
private Double[] tempMean = new Double[12];
private Double[] tempMax = new Double[12];
......@@ -20,7 +20,7 @@ public class WorldclimJson {
@JsonIgnore
private Map<DSDescriptor, Object> other = new HashMap<DSDescriptor, Object>();
public Long[] getPrecipitation() {
public Double[] getPrecipitation() {
return precipitation;
}
......@@ -43,4 +43,20 @@ public class WorldclimJson {
public Map<DSDescriptor, Object> getOther() {
return this.other;
}
public void setPrecipitation(Double[] doubles) {
this.precipitation = doubles;
}
public void setTempMin(Double[] doubles) {
this.tempMin = doubles;
}
public void setTempMean(Double[] doubles) {
this.tempMean = doubles;
}
public void setTempMax(Double[] doubles) {
this.tempMax = doubles;
}
}
......@@ -30,8 +30,6 @@ import org.genesys.blocks.auditlog.service.AuditTrailService;
import org.genesys.catalog.service.DatasetService;
import org.genesys.filerepository.InvalidRepositoryPathException;
import org.genesys.filerepository.model.ImageGallery;
import org.genesys.filerepository.service.ImageGalleryService;
import org.genesys2.server.model.dataset.DS;
import org.genesys2.server.model.elastic.AccessionDetails;
import org.genesys2.server.model.genesys.Accession;
import org.genesys2.server.model.genesys.AccessionCollect;
......@@ -41,7 +39,7 @@ import org.genesys2.server.model.genesys.Taxonomy2;
import org.genesys2.server.model.impl.Crop;
import org.genesys2.server.model.impl.FaoInstitute;
import org.genesys2.server.service.AccessionService;
import org.genesys2.server.service.DSService;
import org.genesys2.server.service.ClimateDataService;
import org.genesys2.server.service.DownloadService;
import org.genesys2.server.service.FilterConstants;
import org.genesys2.server.service.GenesysService;
......@@ -85,14 +83,11 @@ public class AccessionController extends BaseController {
@Autowired
private TaxonomyService taxonomyService;
@Autowired
private DSService dsService;
@Autowired
private InstituteFilesService instituteFilesService;
@Autowired
private ImageGalleryService imageGalleryService;
private ClimateDataService climateDataService;
@Autowired
private DownloadService downloadService;
......@@ -189,10 +184,7 @@ public class AccessionController extends BaseController {
// Worldclim data
if (accessionGeo != null && accessionGeo.getTileIndex() != null) {
DS worldClimDataset = dsService.loadDatasetByUuid(WORLDCLIM_DATASET_UUID);
if (worldClimDataset != null) {
model.addAttribute("worldclimJson", dsService.jsonForTile(worldClimDataset, accessionGeo.getTileIndex()));
}
model.addAttribute("worldclimJson", climateDataService.jsonForTile(accessionGeo.getTileIndex()));
}
model.addAttribute("pdci", accessionId.getPdci());
......
......@@ -18,13 +18,11 @@ package org.genesys2.server.mvc;
import java.util.UUID;
import org.genesys2.server.model.dataset.DS;
import org.genesys2.server.model.genesys.AccessionGeo;
import org.genesys2.server.model.genesys.AccessionHistoric;
import org.genesys2.server.service.ClimateDataService;
import org.genesys2.server.service.CropService;
import org.genesys2.server.service.DSService;
import org.genesys2.server.service.GenesysService;
import org.genesys2.server.service.TaxonomyService;
import org.genesys2.server.service.TraitService;
import org.genesys2.spring.ResourceNotFoundException;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -44,14 +42,11 @@ public class ArchiveController extends BaseController {
@Autowired
private TraitService traitService;
@Autowired
private TaxonomyService taxonomyService;
@Autowired
private CropService cropService;
@Autowired
private DSService dsService;
private ClimateDataService climateDataService;
@RequestMapping(value = "/{uuid:.{36}}", method = RequestMethod.GET)
public String view(ModelMap model, @PathVariable(value = "uuid") UUID uuid) {
......@@ -91,10 +86,7 @@ public class ArchiveController extends BaseController {
// Worldclim data
if (accessionGeo != null && accessionGeo.getTileIndex() != null) {
DS worldClimDataset = dsService.loadDatasetByUuid(AccessionController.WORLDCLIM_DATASET_UUID);
if (worldClimDataset != null) {
model.addAttribute("worldclimJson", dsService.jsonForTile(worldClimDataset, accessionGeo.getTileIndex()));
}
model.addAttribute("worldclimJson", climateDataService.jsonForTile(accessionGeo.getTileIndex()));
}
}
......
......@@ -29,7 +29,6 @@ import org.genesys2.server.service.ElasticsearchService.Term;
import org.genesys2.server.service.ElasticsearchService.TermResult;
import org.genesys2.server.service.FilterConstants;
import org.genesys2.server.service.GeoService;
import org.genesys2.server.service.filter.AccessionFilter;
import org.genesys2.server.service.filter.AppliedFiltersConverter;
import org.genesys2.server.service.impl.FilterHandler;
import org.genesys2.server.service.impl.FilterHandler.AppliedFilters;
......@@ -89,7 +88,7 @@ public class ChartsController extends BaseController {
AppliedFilters appliedFilters = mapper.readValue(jsonFilter, AppliedFilters.class);
// Load all term results
TermResult countryStatistics = elasticService.termStatisticsAuto(Accession.class, AccessionFilter.convert(appliedFilters), Integer.MAX_VALUE, AppliedFiltersConverter.convertTerm(
TermResult countryStatistics = elasticService.termStatisticsAuto(Accession.class, AppliedFilters.convert(appliedFilters), Integer.MAX_VALUE, AppliedFiltersConverter.convertTerm(
FilterConstants.INSTITUTE_COUNTRY_ISO2));
List<Map<String, Object>> resultList = new ArrayList<>();
......
......@@ -42,7 +42,6 @@ import org.genesys2.server.service.ElasticsearchService;
import org.genesys2.server.service.FilterConstants;
import org.genesys2.server.service.GenesysService;
import org.genesys2.server.service.ProjectService;
import org.genesys2.server.service.filter.AccessionFilter;
import org.genesys2.server.service.filter.AppliedFiltersConverter;
import org.genesys2.server.service.impl.FilterHandler;
import org.genesys2.server.service.impl.FilterHandler.AppliedFilter;
......@@ -120,10 +119,10 @@ public class ProjectController extends BaseController {
model.addAttribute("jsonFilter", filters.toString());
try {
model.addAttribute("statisticsCrop", elasticService.termStatisticsAuto(Accession.class, AccessionFilter.convert(filters), 5, AppliedFiltersConverter.convertTerm(FilterConstants.CROPS)));
model.addAttribute("statisticsGenus", elasticService.termStatisticsAuto(Accession.class, AccessionFilter.convert(filters), 5, AppliedFiltersConverter.convertTerm(FilterConstants.TAXONOMY_GENUS)));
model.addAttribute("statisticsTaxonomy", elasticService.termStatisticsAuto(Accession.class, AccessionFilter.convert(filters), 5, AppliedFiltersConverter.convertTerm(FilterConstants.TAXONOMY_GENUSSPECIES)));
model.addAttribute("statisticsOrigCty", elasticService.termStatisticsAuto(Accession.class, AccessionFilter.convert(filters), 100, AppliedFiltersConverter.convertTerm(FilterConstants.ORGCTY_ISO3)));
model.addAttribute("statisticsCrop", elasticService.termStatisticsAuto(Accession.class, AppliedFilters.convert(filters), 5, AppliedFiltersConverter.convertTerm(FilterConstants.CROPS)));
model.addAttribute("statisticsGenus", elasticService.termStatisticsAuto(Accession.class, AppliedFilters.convert(filters), 5, AppliedFiltersConverter.convertTerm(FilterConstants.TAXONOMY_GENUS)));
model.addAttribute("statisticsTaxonomy", elasticService.termStatisticsAuto(Accession.class, AppliedFilters.convert(filters), 5, AppliedFiltersConverter.convertTerm(FilterConstants.TAXONOMY_GENUSSPECIES)));
model.addAttribute("statisticsOrigCty", elasticService.termStatisticsAuto(Accession.class, AppliedFilters.convert(filters), 100, AppliedFiltersConverter.convertTerm(FilterConstants.ORGCTY_ISO3)));
} catch (SearchException e) {
LOG.warn(e.getMessage());
}
......@@ -260,7 +259,7 @@ public class ProjectController extends BaseController {
response.addHeader("Content-Disposition", String.format("attachment; filename=\"genesys-accessions-%1$s.zip\"", project.getCode()));
final OutputStream outputStream = response.getOutputStream();
genesysService.writeAccessions(AccessionFilter.convert(filters), outputStream);
genesysService.writeAccessions(AppliedFilters.convert(filters), outputStream);
response.flushBuffer();
}
......@@ -283,7 +282,7 @@ public class ProjectController extends BaseController {
final OutputStream outputStream = response.getOutputStream();
try {
downloadService.writeXlsxMCPD(AccessionFilter.convert(filters), outputStream);
downloadService.writeXlsxMCPD(AppliedFilters.convert(filters), outputStream);
response.flushBuffer();
} catch (EOFException e) {
LOG.warn("Download was aborted", e);
......@@ -309,7 +308,7 @@ public class ProjectController extends BaseController {
final OutputStream outputStream = response.getOutputStream();
try {
downloadService.writeXlsxPDCI(AccessionFilter.convert(filters), outputStream);
downloadService.writeXlsxPDCI(AppliedFilters.convert(filters), outputStream);
response.flushBuffer();
} catch (EOFException e) {
LOG.warn("Download was aborted", e);
......
......@@ -16,7 +16,11 @@
package org.genesys2.server.mvc.admin;
import java.io.EOFException;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.http.HttpServletResponse;
import org.genesys2.server.model.dataset.DS;
import org.genesys2.server.model.dataset.DSColumn;
......@@ -68,4 +72,25 @@ public class DS2Controller {
}
return "redirect:/admin/ds2/";
}
@RequestMapping(value = "/worldclim/download", method = RequestMethod.POST)
public void worldclimDownload(HttpServletResponse response) throws IOException {
DS ds = dsService.loadDatasetByUuid(WorldClimUpdater.WORLDCLIM_DATASET);
// Write MCPD to the stream.
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.addHeader("Content-Disposition", String.format("attachment; filename=\"worldclim-%1s.xlsx\"", System.currentTimeMillis()));
// response.flushBuffer();
final OutputStream outputStream = response.getOutputStream();
try {
dsService.download(ds, outputStream);
response.flushBuffer();
} catch (EOFException e) {
LOG.warn("Download was aborted: {}", e.getMessage());
}
}
}
/*
* Copyright 2018 Global Crop Diversity Trust
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.genesys2.server.persistence;
import org.genesys2.server.model.impl.TileClimate;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;
/**
* The JPA TileClimateRepository.
*/
public interface TileClimateRepository extends JpaRepository<TileClimate, Long>, QueryDslPredicateExecutor<TileClimate> {
}
/*
* Copyright 2018 Global Crop Diversity Trust
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.genesys2.server.service;
import java.nio.MappedByteBuffer;
import java.util.HashSet;
import java.util.List;
import org.genesys2.server.model.genesys.AccessionGeo;
import org.genesys2.server.model.impl.TileClimate;
import org.genesys2.server.model.json.WorldclimJson;
/**
* The ClimateDataService interface.
*/
public interface ClimateDataService {
void worldclimUpdate(String variableName, HashSet<Long> ids, MappedByteBuffer buffer, short nullValue, double factor);
TileClimate climateForTile(Long tileIndex);
void updateAccessionTileIndex(List<AccessionGeo> toSave);
WorldclimJson jsonForTile(Long tileIndex);
}
/*
* Copyright 2018 Global Crop Diversity Trust
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.genesys2.server.service;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.MappedByteBuffer;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import org.genesys2.server.model.dataset.DS;
import org.genesys2.server.model.dataset.DSColumn;
import org.genesys2.server.model.dataset.DSQualifier;
import org.genesys2.server.model.dataset.DSDescriptor;
import org.genesys2.server.model.genesys.AccessionGeo;
import org.genesys2.server.model.json.WorldclimJson;
import org.genesys2.server.model.dataset.DSQualifier;
/**
* The DSService interface.
*/
public interface DSService {
/**
* Save dataset.
*
* @param ds the ds
* @return the ds
*/
DS saveDataset(DS ds);
/**
* Adds the qualifier.
*
* @param ds the ds
* @param d1 the d 1
* @return the DS qualifier
*/
DSQualifier addQualifier(DS ds, DSDescriptor d1);
/**
* Adds the descriptor.
*
* @param ds the ds
* @param dSDescriptor the d S descriptor
* @return the DS column
*/
DSColumn addDescriptor(DS ds, DSDescriptor dSDescriptor);
/**
* Load dataset by uuid.
*
* @param uuid the uuid
* @return the ds
*/
DS loadDatasetByUuid(UUID uuid);
/**
* Update row.
*
* @param ds the ds
* @param row the row
*/
void updateRow(DS ds, Object[] row);
/**
* Update rows.
*
* @param ds the ds
* @param rows the rows
*/
void updateRows(DS ds, List<Object[]> rows);
/**
* Update row.
*
* @param ds the ds
* @param qualifiers the qualifiers
* @param dsd the dsd
* @param value the value
*/
void updateRow(DS ds, Object[] qualifiers, DSColumn dsd, Object value);
void worldclimUpdate(DS dataset, DSColumn dsd, Set<Long> ids, MappedByteBuffer buffer, short nullValue, double factor);
void updateAccessionTileIndex(List<AccessionGeo> toSave);
WorldclimJson jsonForTile(DS worldClimDataset, Long tileIndex);
/**
* Download.
*
* @param ds the ds
* @param outputStream the output stream
* @throws IOException Signals that an I/O exception has occurred.
*/
void download(DS ds, OutputStream outputStream) throws IOException;
/**
* Download.
*
* @param ds the ds
* @param dsds the dsds
* @param outputStream the output stream
* @throws IOException Signals that an I/O exception has occurred.
*/
void download(DS ds, List<DSColumn> dsds, OutputStream outputStream) throws IOException;
/**
* Delete dataset.
*
* @param ds the ds
*/
void deleteDataset(DS ds);
/**
* Delete descriptor.
*
* @param dsd the dsd
*/
void deleteDescriptor(DSColumn dsd);
/**
* Delete rows.
*
* @param ds the ds
*/
void deleteRows(DS ds);
}
......@@ -24,7 +24,6 @@ import org.genesys.blocks.model.filters.StringFilter;
import org.genesys.blocks.model.filters.UuidModelFilter;
import org.genesys2.server.model.genesys.Accession;
import org.genesys2.server.model.genesys.QAccession;
import org.genesys2.server.service.impl.FilterHandler.AppliedFilters;
import com.hazelcast.util.CollectionUtil;
import com.querydsl.core.BooleanBuilder;
......@@ -199,20 +198,6 @@ public class AccessionFilter extends UuidModelFilter<AccessionFilter, Accession>
return and;
}
/**
* Convert.
*
* @param filters the filters
* @return the accession filter
*/
public static AccessionFilter convert(AppliedFilters filters) {
try {
return AppliedFiltersConverter.convert(filters);
} catch (Throwable e) {
throw new RuntimeException("Could not convert filters", e);
}
}
/**
* Historic.
*
......
......@@ -40,6 +40,9 @@ public class AccessionGeoFilter extends BasicModelFilter<AccessionGeoFilter, Acc
public NumberFilter<Double> elevation;
public Boolean referenced;
/** The climate. */
public ClimateFilter climate;
/**
* Builds the query.
......@@ -78,6 +81,9 @@ public class AccessionGeoFilter extends BasicModelFilter<AccessionGeoFilter, Acc
if (elevation != null) {
and.and(elevation.buildQuery(accessiongeo.elevation));
}
if (climate != null) {
and.and(climate.buildQuery(accessiongeo.climate));
}
return and;
}
......
/*
* Copyright 2018 Global Crop Diversity Trust
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.genesys2.server.service.filter;
import java.util.Set;
import org.apache.commons.collections.CollectionUtils;
import org.genesys.blocks.model.filters.NumberFilter;
import org.genesys2.server.model.impl.QTileClimate;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.Predicate;
/**
* The Class ClimateFilter.
*/
public class ClimateFilter {
/** The latitude. */
public Set<Long> tileIndex;
public NumberFilter<Double> alt;
public NumberFilter<Double> bio1;
public NumberFilter<Double> bio2;
public NumberFilter<Double> bio3;
public NumberFilter<Double> bio4;
public NumberFilter<Double> bio5;
public NumberFilter<Double> bio6;
public NumberFilter<Double> bio7;
public NumberFilter<Double> bio8;
public NumberFilter<Double> bio9;
public NumberFilter<Double> bio10;
public NumberFilter<Double> bio11;
public NumberFilter<Double> bio12;
public NumberFilter<Double> bio13;
public NumberFilter<Double> bio14;
public NumberFilter<Double> bio15;
public NumberFilter<Double> prec1;
public NumberFilter<Double> prec2;
public NumberFilter<Double> prec3;
public NumberFilter<Double> prec4;
public NumberFilter<Double> prec5;
public NumberFilter<Double> prec6;
public NumberFilter<Double> prec7;
public NumberFilter<Double> prec8;
public NumberFilter<Double> prec9;
public NumberFilter<Double> prec10;
public NumberFilter<Double> prec11;
public NumberFilter<Double> prec12;
public NumberFilter<Double> tmax1;
public NumberFilter<Double> tmax2;
public NumberFilter<Double> tmax3;
public NumberFilter<Double> tmax4;
public NumberFilter<Double> tmax5;
public NumberFilter<Double> tmax6;
public NumberFilter<Double> tmax7;
public NumberFilter<Double> tmax8;
public NumberFilter<Double> tmax9;
public NumberFilter<Double> tmax10;
public NumberFilter<Double> tmax11;
public NumberFilter<Double> tmax12;
public NumberFilter<Double> tmean1;
public NumberFilter<Double> tmean2;
public NumberFilter<Double> tmean3;
public NumberFilter<Double> tmean4;
public NumberFilter<Double> tmean5;
public NumberFilter<Double> tmean6;
public NumberFilter<Double> tmean7;
public NumberFilter<Double> tmean8;
public NumberFilter<Double> tmean9;
public NumberFilter<Double> tmean10;
public NumberFilter<Double> tmean11;
public NumberFilter<Double> tmean12;
public NumberFilter<Double> tmin1;
public NumberFilter<Double> tmin2;
public NumberFilter<Double> tmin3;
public NumberFilter<Double> tmin4;
public NumberFilter<Double> tmin5;
public NumberFilter<Double> tmin6;
public NumberFilter<Double> tmin7;
public NumberFilter<Double> tmin8;
public NumberFilter<Double> tmin9;
public NumberFilter<Double> tmin10;
public NumberFilter<Double> tmin11;
public NumberFilter<Double> tmin12;
/**
* Builds the query.
*
* @param qtileClimate the qtile climate