/*
* Constellation - An open source and standard compliant SDI
* http://www.constellation-sdi.org
*
* Copyright 2015 Geomatys.
*
* 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.constellation.database.impl.repository;
import static org.constellation.database.api.jooq.Tables.METADATA;
import static org.constellation.database.api.jooq.Tables.METADATA_BBOX;
import static org.constellation.database.api.jooq.Tables.METADATA_X_CSW;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.constellation.database.api.MetadataComplete;
import static org.constellation.database.api.jooq.Tables.SERVICE;
import org.constellation.database.api.jooq.tables.pojos.Metadata;
import org.constellation.database.api.jooq.tables.pojos.MetadataBbox;
import org.constellation.database.api.jooq.tables.pojos.MetadataXCsw;
import org.constellation.database.api.jooq.tables.records.MetadataBboxRecord;
import org.constellation.database.api.jooq.tables.records.MetadataRecord;
import org.constellation.database.api.jooq.tables.records.MetadataXCswRecord;
import org.constellation.database.api.repository.MetadataRepository;
import org.jooq.AggregateFunction;
import org.jooq.Field;
import org.jooq.Record;
import org.jooq.Record1;
import org.jooq.Select;
import org.jooq.SelectConditionStep;
import org.jooq.SelectJoinStep;
import org.jooq.SelectLimitStep;
import org.jooq.SortField;
import org.jooq.UpdateSetFirstStep;
import org.jooq.impl.DSL;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
*
* @author Guilhem Legal (Geomatys)
*/
@Component
public class JooqMetadataRepository extends AbstractJooqRespository<MetadataRecord, Metadata> implements MetadataRepository {
public JooqMetadataRepository() {
super(Metadata.class, METADATA);
}
@Override
@Transactional(propagation = Propagation.MANDATORY)
public Metadata update(MetadataComplete metadata) {
UpdateSetFirstStep<MetadataRecord> update = dsl.update(METADATA);
update.set(METADATA.METADATA_ID, metadata.getMetadataId());
update.set(METADATA.METADATA_ISO, metadata.getMetadataIso());
if (metadata.getDatasetId() != null) update.set(METADATA.DATASET_ID, metadata.getDatasetId());
if (metadata.getDataId() != null) update.set(METADATA.DATA_ID, metadata.getDataId());
if (metadata.getServiceId() != null) update.set(METADATA.SERVICE_ID, metadata.getServiceId());
if (metadata.getMdCompletion() != null) update.set(METADATA.MD_COMPLETION, metadata.getMdCompletion());
if (metadata.getParentIdentifier() != null) update.set(METADATA.PARENT_IDENTIFIER, metadata.getParentIdentifier());
update.set(METADATA.OWNER, metadata.getOwner());
update.set(METADATA.DATESTAMP, metadata.getDatestamp());
update.set(METADATA.DATE_CREATION, metadata.getDateCreation());
update.set(METADATA.LEVEL, metadata.getLevel());
if (metadata.getIsPublished() != null) update.set(METADATA.IS_PUBLISHED, metadata.getIsPublished());
else update.set(METADATA.IS_PUBLISHED, false);
if (metadata.getIsValidated() != null) update.set(METADATA.IS_VALIDATED, metadata.getIsValidated());
else update.set(METADATA.IS_VALIDATED, false);
if (metadata.getValidationRequired() != null) update.set(METADATA.VALIDATION_REQUIRED, metadata.getValidationRequired());
update.set(METADATA.COMMENT, metadata.getComment());
update.set(METADATA.VALIDATED_STATE, metadata.getValidatedState());
update.set(METADATA.PROFILE, metadata.getProfile());
update.set(METADATA.TITLE, metadata.getTitle());
update.set(METADATA.RESUME, metadata.getResume()).where(METADATA.ID.eq(metadata.getId())).execute();
updateBboxes(metadata.getId(), metadata.getBboxes());
return metadata;
}
private void updateBboxes(int metadataID, List<MetadataBbox> bboxes) {
dsl.delete(METADATA_BBOX).where(METADATA_BBOX.METADATA_ID.eq(metadataID)).execute();
for (MetadataBbox bbox : bboxes) {
MetadataBboxRecord record = dsl.newRecord(METADATA_BBOX);
record.setMetadataId(metadataID);
record.setEast(bbox.getEast());
record.setWest(bbox.getWest());
record.setNorth(bbox.getNorth());
record.setSouth(bbox.getSouth());
record.store();
}
}
@Override
@Transactional(propagation = Propagation.MANDATORY)
public int create(MetadataComplete metadata) {
MetadataRecord metadataRecord = dsl.newRecord(METADATA);
metadataRecord.setMetadataId(metadata.getMetadataId());
metadataRecord.setMetadataIso(metadata.getMetadataIso());
if (metadata.getDataId() != null) metadataRecord.setDataId(metadata.getDataId());
if (metadata.getDatasetId() != null) metadataRecord.setDatasetId(metadata.getDatasetId());
if (metadata.getServiceId() != null) metadataRecord.setServiceId(metadata.getServiceId());
if (metadata.getMdCompletion() != null) metadataRecord.setMdCompletion(metadata.getMdCompletion());
if (metadata.getParentIdentifier() != null) metadataRecord.setParentIdentifier(metadata.getParentIdentifier());
metadataRecord.setDateCreation(metadata.getDateCreation());
metadataRecord.setDatestamp(metadata.getDatestamp());
metadataRecord.setLevel(metadata.getLevel());
metadataRecord.setOwner(metadata.getOwner());
metadataRecord.setProfile(metadata.getProfile());
metadataRecord.setTitle(metadata.getTitle());
metadataRecord.setResume(metadata.getResume());
metadataRecord.setComment(metadata.getComment());
metadataRecord.setValidatedState(metadata.getValidatedState());
if (metadata.getValidationRequired() != null) metadataRecord.setValidationRequired(metadata.getValidationRequired());
if (metadata.getIsPublished() != null) metadataRecord.setIsPublished(metadata.getIsPublished());
else metadataRecord.setIsPublished(false); //default
if (metadata.getIsValidated() != null) metadataRecord.setIsValidated(metadata.getIsValidated());
else metadataRecord.setIsValidated(false); //default
metadataRecord.store();
updateBboxes(metadataRecord.getId(), metadata.getBboxes());
return metadataRecord.getId();
}
@Override
public Metadata findByMetadataId(String metadataId) {
return dsl.select().from(METADATA).where(METADATA.METADATA_ID.eq(metadataId)).fetchOneInto(Metadata.class);
}
@Override
public Metadata findById(int id) {
return dsl.select().from(METADATA).where(METADATA.ID.eq(id)).fetchOneInto(Metadata.class);
}
@Override
public Metadata findByDataId(int dataId) {
return dsl.select().from(METADATA).where(METADATA.DATA_ID.eq(dataId)).fetchOneInto(Metadata.class);
}
@Override
public Metadata findByDatasetId(int datasetId) {
return dsl.select().from(METADATA).where(METADATA.DATASET_ID.eq(datasetId)).fetchOneInto(Metadata.class);
}
@Override
public MetadataXCsw addMetadataToCSW(final String metadataID, final int serviceID) {
final Metadata metadata = dsl.select().from(METADATA).where(METADATA.METADATA_ID.eq(metadataID)).fetchOneInto(Metadata.class);
if (metadata != null) {
final MetadataXCsw dxc = dsl.select().from(METADATA_X_CSW).where(METADATA_X_CSW.CSW_ID.eq(serviceID)).and(METADATA_X_CSW.METADATA_ID.eq(metadata.getId())).fetchOneInto(MetadataXCsw.class);
if (dxc == null) {
MetadataXCswRecord newRecord = dsl.newRecord(METADATA_X_CSW);
newRecord.setCswId(serviceID);
newRecord.setMetadataId(metadata.getId());
newRecord.store();
return newRecord.into(MetadataXCsw.class);
}
return dxc;
}
return null;
}
@Override
public void removeDataFromCSW(final String metadataID, final int serviceID) {
final Metadata metadata = dsl.select().from(METADATA).where(METADATA.METADATA_ID.eq(metadataID)).fetchOneInto(Metadata.class);
if (metadata != null) {
dsl.delete(METADATA_X_CSW).where(METADATA_X_CSW.CSW_ID.eq(serviceID)).and(METADATA_X_CSW.METADATA_ID.eq(metadata.getId())).execute();
}
}
@Override
public List<Metadata> findByCswId(Integer id) {
return dsl.select(METADATA.fields()).from(METADATA, METADATA_X_CSW)
.where(METADATA_X_CSW.METADATA_ID.eq(METADATA.ID))
.and(METADATA_X_CSW.CSW_ID.eq(id)).fetchInto(Metadata.class);
}
@Override
public List<String> findMetadataIDByCswId(final Integer id, final boolean includeService, final boolean onlyPublished) {
SelectConditionStep<Record1<String>> query =
dsl.select(METADATA.METADATA_ID).from(METADATA, METADATA_X_CSW)
.where(METADATA_X_CSW.METADATA_ID.eq(METADATA.ID))
.and(METADATA_X_CSW.CSW_ID.eq(id));
if (!includeService) {
query = query.and(METADATA.SERVICE_ID.isNull());
}
if (onlyPublished) {
query = query.and(METADATA.IS_PUBLISHED.eq(Boolean.TRUE));
}
return query.fetchInto(String.class);
}
@Override
public int countMetadataByCswId(final Integer id, final boolean includeService, final boolean onlyPublished) {
SelectConditionStep<Record1<String>> query =
dsl.select(METADATA.METADATA_ID).from(METADATA, METADATA_X_CSW)
.where(METADATA_X_CSW.METADATA_ID.eq(METADATA.ID))
.and(METADATA_X_CSW.CSW_ID.eq(id));
if (!includeService) {
query = query.and(METADATA.SERVICE_ID.isNull());
}
if (onlyPublished) {
query = query.and(METADATA.IS_PUBLISHED.eq(Boolean.TRUE));
}
return query.fetchCount();
}
@Override
public List<String> findMetadataID(final boolean includeService, final boolean onlyPublished) {
SelectJoinStep<Record1<String>> query = dsl.select(METADATA.METADATA_ID).from(METADATA);
if (includeService && !onlyPublished) {
return query.fetchInto(String.class);
}
SelectConditionStep<Record1<String>> filterQuery = null;
if (!includeService) {
filterQuery = query.where(METADATA.SERVICE_ID.isNull());
}
if (onlyPublished) {
if (filterQuery == null) {
filterQuery = query.where(METADATA.IS_PUBLISHED.eq(Boolean.TRUE));
} else {
filterQuery = filterQuery.and(METADATA.IS_PUBLISHED.eq(Boolean.TRUE));
}
}
return filterQuery.fetchInto(String.class);
}
@Override
public int countMetadata(final boolean includeService, final boolean onlyPublished) {
SelectJoinStep<Record1<String>> query = dsl.select(METADATA.METADATA_ID).from(METADATA);
if (includeService && !onlyPublished) {
return query.fetchCount();
}
SelectConditionStep<Record1<String>> filterQuery = null;
if (!includeService) {
filterQuery = query.where(METADATA.SERVICE_ID.isNull());
}
if (onlyPublished) {
if (filterQuery == null) {
filterQuery = query.where(METADATA.IS_PUBLISHED.eq(Boolean.TRUE));
} else {
filterQuery = filterQuery.and(METADATA.IS_PUBLISHED.eq(Boolean.TRUE));
}
}
return filterQuery.fetchCount();
}
@Override
public List<Metadata> findAll(final boolean includeService, final boolean onlyPublished) {
SelectJoinStep<Record> query = dsl.select(METADATA.fields()).from(METADATA);
if (includeService && !onlyPublished) {
return query.fetchInto(Metadata.class);
}
SelectConditionStep<Record> filterQuery = null;
if (!includeService) {
filterQuery = query.where(METADATA.SERVICE_ID.isNull());
}
if (onlyPublished) {
if (filterQuery == null) {
filterQuery = query.where(METADATA.IS_PUBLISHED.eq(Boolean.TRUE));
} else {
filterQuery = filterQuery.and(METADATA.IS_PUBLISHED.eq(Boolean.TRUE));
}
}
return filterQuery.fetchInto(Metadata.class);
}
@Override
public List<String> findAllIsoMetadata(final boolean includeService, final boolean onlyPublished) {
SelectJoinStep<Record1<String>> query = dsl.select(METADATA.METADATA_ISO).from(METADATA);
if (includeService && !onlyPublished) {
return query.fetchInto(String.class);
}
SelectConditionStep<Record1<String>> filterQuery = null;
if (!includeService) {
filterQuery = query.where(METADATA.SERVICE_ID.isNull());
}
if (onlyPublished) {
if (filterQuery == null) {
filterQuery = query.where(METADATA.IS_PUBLISHED.eq(Boolean.TRUE));
} else {
filterQuery = filterQuery.and(METADATA.IS_PUBLISHED.eq(Boolean.TRUE));
}
}
return filterQuery.fetchInto(String.class);
}
@Override
public boolean isLinkedMetadata(Integer metadataID, Integer cswID) {
return dsl.select(METADATA.fields()).from(METADATA, METADATA_X_CSW)
.where(METADATA_X_CSW.METADATA_ID.eq(METADATA.ID))
.and(METADATA_X_CSW.CSW_ID.eq(cswID))
.and(METADATA_X_CSW.METADATA_ID.eq(metadataID)).fetchOneInto(Metadata.class) != null;
}
@Override
public boolean isLinkedMetadata(String metadataID, String cswID) {
return dsl.select(METADATA.fields()).from(METADATA, METADATA_X_CSW, SERVICE)
.where(METADATA_X_CSW.METADATA_ID.eq(METADATA.ID))
.and(METADATA_X_CSW.CSW_ID.eq(SERVICE.ID))
.and(SERVICE.IDENTIFIER.eq(cswID))
.and(SERVICE.TYPE.eq("csw"))
.and(METADATA.METADATA_ID.eq(metadataID)).fetchOneInto(Metadata.class) != null;
}
@Override
public boolean isLinkedMetadata(String metadataID, String cswID, final boolean includeService, final boolean onlyPublished) {
SelectConditionStep query = dsl.select(METADATA.ID).from(METADATA, METADATA_X_CSW, SERVICE)
.where(METADATA_X_CSW.METADATA_ID.eq(METADATA.ID))
.and(METADATA_X_CSW.CSW_ID.eq(SERVICE.ID))
.and(SERVICE.IDENTIFIER.eq(cswID))
.and(SERVICE.TYPE.eq("csw"))
.and(METADATA.METADATA_ID.eq(metadataID));
if (!includeService) {
query = query.and(METADATA.SERVICE_ID.isNull());
}
if (onlyPublished) {
query = query.and(METADATA.IS_PUBLISHED.eq(Boolean.TRUE));
}
return query.fetchOne() != null;
}
/**
* Returns a map that contains id of metadata as key and the title of metadata as value.
* the filterMap passed in arguments is optional and can contains one or multiple filter on each field.
* This method is used for selection of rows to check the state when using server pagination,
* the pagination should not be included in this result to keep a list of all existing ids.
* @param filterMap
* @return
*/
@Override
public Map<Integer,String> filterAndGetWithoutPagination(final Map<String,Object> filterMap) {
Select query = null;
Collection<Field<?>> fields = new ArrayList<>();
Collections.addAll(fields,METADATA.ID,METADATA.TITLE);
if(filterMap != null) {
for(final Map.Entry<String,Object> entry : filterMap.entrySet()) {
if("owner".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.OWNER.equal((Integer)entry.getValue()));
}else {
query = ((SelectConditionStep)query).and(METADATA.OWNER.equal((Integer)entry.getValue()));
}
}else if("profile".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.PROFILE.equal((String)entry.getValue()));
}else {
query = ((SelectConditionStep)query).and(METADATA.PROFILE.equal((String) entry.getValue()));
}
}else if("validated".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.IS_VALIDATED.equal((Boolean)entry.getValue()));
}else {
query = ((SelectConditionStep)query).and(METADATA.IS_VALIDATED.equal((Boolean) entry.getValue()));
}
}else if("validation_required".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.VALIDATION_REQUIRED.equal((String)entry.getValue()));
}else {
query = ((SelectConditionStep)query).and(METADATA.VALIDATION_REQUIRED.equal((String) entry.getValue()));
}
}else if("id".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.METADATA_ID.equal((String)entry.getValue()));
}else {
query = ((SelectConditionStep)query).and(METADATA.METADATA_ID.equal((String) entry.getValue()));
}
}else if("parent".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.PARENT_IDENTIFIER.equal((Integer)entry.getValue()).or(METADATA.ID.equal((Integer)entry.getValue())));
}else {
query = ((SelectConditionStep)query).and(METADATA.PARENT_IDENTIFIER.equal((Integer)entry.getValue()).or(METADATA.ID.equal((Integer)entry.getValue())));
}
}else if("published".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.IS_PUBLISHED.equal((Boolean)entry.getValue()));
}else {
query = ((SelectConditionStep)query).and(METADATA.IS_PUBLISHED.equal((Boolean) entry.getValue()));
}
}else if("level".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.LEVEL.equal((String)entry.getValue()));
}else {
query = ((SelectConditionStep)query).and(METADATA.LEVEL.equal((String) entry.getValue()));
}
}else if("term".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.TITLE.likeIgnoreCase("%"+entry.getValue()+"%").or(METADATA.RESUME.likeIgnoreCase("%"+entry.getValue()+"%")));
}else {
query = ((SelectConditionStep)query).and(METADATA.TITLE.likeIgnoreCase("%"+entry.getValue()+"%").or(METADATA.RESUME.likeIgnoreCase("%"+entry.getValue()+"%")));
}
}else if ("period".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.DATESTAMP.greaterOrEqual((Long)entry.getValue()));
}else {
query = ((SelectConditionStep)query).and(METADATA.DATESTAMP.greaterOrEqual((Long) entry.getValue()));
}
}
}
}
if(query == null) {
return dsl.select(fields).from(METADATA).fetchMap(METADATA.ID, METADATA.TITLE);
}else {
return query.fetchMap(METADATA.ID,METADATA.TITLE);
}
}
/**
* Returns a singleton map that contains the total count of records as key,
* and the list of records as value.
* the list is resulted by filters, it use pagination and sorting.
* @param filterMap given filters
* @param sortEntry given sort
* @param pageNumber pagination page
* @param rowsPerPage count of rows per page
* @return Map
*/
@Override
public Map<Integer, List> filterAndGet(final Map<String,Object> filterMap,
final Map.Entry<String,String> sortEntry,
final int pageNumber,
final int rowsPerPage) {
final Map<Integer,List> result = new HashMap<>();
Collection<Field<?>> fields = new ArrayList<>();
Collections.addAll(fields,METADATA.ID,METADATA.METADATA_ID,
METADATA.TITLE,METADATA.PROFILE,METADATA.OWNER,METADATA.DATESTAMP,
METADATA.DATE_CREATION,METADATA.MD_COMPLETION,METADATA.LEVEL,
METADATA.IS_VALIDATED,METADATA.IS_PUBLISHED,METADATA.RESUME,
METADATA.VALIDATION_REQUIRED,METADATA.COMMENT);
Select query = null;
if(filterMap != null) {
for(final Map.Entry<String,Object> entry : filterMap.entrySet()) {
if("owner".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.OWNER.equal((Integer)entry.getValue()));
}else {
query = ((SelectConditionStep)query).and(METADATA.OWNER.equal((Integer)entry.getValue()));
}
}else if("profile".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.PROFILE.equal((String)entry.getValue()));
}else {
query = ((SelectConditionStep)query).and(METADATA.PROFILE.equal((String) entry.getValue()));
}
}else if("validated".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.IS_VALIDATED.equal((Boolean)entry.getValue()));
}else {
query = ((SelectConditionStep)query).and(METADATA.IS_VALIDATED.equal((Boolean) entry.getValue()));
}
}else if("validation_required".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.VALIDATION_REQUIRED.equal((String)entry.getValue()));
}else {
query = ((SelectConditionStep)query).and(METADATA.VALIDATION_REQUIRED.equal((String) entry.getValue()));
}
}else if("id".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.METADATA_ID.equal((String)entry.getValue()));
}else {
query = ((SelectConditionStep)query).and(METADATA.METADATA_ID.equal((String) entry.getValue()));
}
}else if("parent".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.PARENT_IDENTIFIER.equal((Integer)entry.getValue()).or(METADATA.ID.equal((Integer)entry.getValue())));
}else {
query = ((SelectConditionStep)query).and(METADATA.PARENT_IDENTIFIER.equal((Integer)entry.getValue()).or(METADATA.ID.equal((Integer)entry.getValue())));
}
}else if("published".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.IS_PUBLISHED.equal((Boolean)entry.getValue()));
}else {
query = ((SelectConditionStep)query).and(METADATA.IS_PUBLISHED.equal((Boolean) entry.getValue()));
}
}else if("level".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.LEVEL.equal((String)entry.getValue()));
}else {
query = ((SelectConditionStep)query).and(METADATA.LEVEL.equal((String) entry.getValue()));
}
}else if("term".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.TITLE.likeIgnoreCase("%"+entry.getValue()+"%").or(METADATA.RESUME.likeIgnoreCase("%"+entry.getValue()+"%")));
}else {
query = ((SelectConditionStep)query).and(METADATA.TITLE.likeIgnoreCase("%"+entry.getValue()+"%").or(METADATA.RESUME.likeIgnoreCase("%"+entry.getValue()+"%")));
}
}else if ("period".equals(entry.getKey())) {
if(query == null) {
query = dsl.select(fields).from(METADATA).where(METADATA.DATESTAMP.greaterOrEqual((Long)entry.getValue()));
}else {
query = ((SelectConditionStep)query).and(METADATA.DATESTAMP.greaterOrEqual((Long) entry.getValue()));
}
}
}
}
if(sortEntry != null) {
final SortField f;
if("title".equals(sortEntry.getKey())){
f = "ASC".equals(sortEntry.getValue()) ? METADATA.TITLE.asc() : METADATA.TITLE.desc();
}else {
f = "ASC".equals(sortEntry.getValue()) ? METADATA.DATESTAMP.asc() : METADATA.DATESTAMP.desc();
}
if(query == null) {
query = dsl.select(fields).from(METADATA).orderBy(f);
}else {
query = ((SelectConditionStep)query).orderBy(f);
}
}
if(query == null) { //means there are no sorting and no filters
final int count = dsl.selectCount().from(METADATA).fetchOne(0,int.class);
result.put(count,dsl.select(fields).from(METADATA).limit(rowsPerPage).offset((pageNumber - 1) * rowsPerPage).fetchInto(Metadata.class));
}else {
final int count = dsl.fetchCount(query);
result.put(count, ((SelectLimitStep) query).limit(rowsPerPage).offset((pageNumber - 1) * rowsPerPage).fetchInto(Metadata.class));
}
return result;
}
@Override
@Transactional(propagation = Propagation.MANDATORY)
public int delete(final int id) {
dsl.delete(METADATA_BBOX).where(METADATA_BBOX.METADATA_ID.eq(id)).execute();
return dsl.delete(METADATA).where(METADATA.ID.eq(id)).execute();
}
@Override
@Transactional(propagation = Propagation.MANDATORY)
public void deleteAll() {
dsl.delete(METADATA).execute();
}
@Override
@Transactional(propagation = Propagation.MANDATORY)
public void changeOwner(final int id, final int owner) {
UpdateSetFirstStep<MetadataRecord> update = dsl.update(METADATA);
update.set(METADATA.OWNER, owner).where(METADATA.ID.eq(id)).execute();
}
@Override
@Transactional(propagation = Propagation.MANDATORY)
public void changeValidation(int id, boolean validated) {
UpdateSetFirstStep<MetadataRecord> update = dsl.update(METADATA);
update.set(METADATA.IS_VALIDATED, validated).where(METADATA.ID.eq(id)).execute();
}
@Override
@Transactional(propagation = Propagation.MANDATORY)
public void changePublication(int id, boolean published) {
UpdateSetFirstStep<MetadataRecord> update = dsl.update(METADATA);
update.set(METADATA.IS_PUBLISHED, published).where(METADATA.ID.eq(id)).execute();
}
@Override
@Transactional(propagation = Propagation.MANDATORY)
public void changeProfile(int id, String newProfile) {
UpdateSetFirstStep<MetadataRecord> update = dsl.update(METADATA);
update.set(METADATA.PROFILE, newProfile).where(METADATA.ID.eq(id)).execute();
}
@Override
public List<MetadataBbox> getBboxes(int id) {
return dsl.select().from(METADATA_BBOX).where(METADATA_BBOX.METADATA_ID.eq(id)).fetchInto(MetadataBbox.class);
}
@Override
public Map<String,Integer> getProfilesCount(final Map<String,Object> filterMap) {
final Integer owner = (Integer) filterMap.get("owner");
final Long period = (Long) filterMap.get("period");
AggregateFunction<Integer> count = DSL.count(METADATA.PROFILE);
SelectJoinStep select = dsl.select(METADATA.PROFILE, count ).from(METADATA);
SelectConditionStep cond = null;
if (owner != null) {
cond = select.where(METADATA.OWNER.eq(owner));
select = null;
}
if (period != null) {
if (select == null) {
cond = cond.and(METADATA.DATESTAMP.greaterOrEqual(period));
} else {
cond = select.where(METADATA.DATESTAMP.greaterOrEqual(period));
select = null;
}
}
if (select != null) {
return select.groupBy(METADATA.PROFILE).orderBy(count.desc()).fetchMap(METADATA.PROFILE, count);
} else {
return cond.groupBy(METADATA.PROFILE).orderBy(count.desc()).fetchMap(METADATA.PROFILE, count);
}
}
@Override
public int countInCompletionRange(final Map<String,Object> filterMap, final int minCompletion, final int maxCompletion) {
final Integer owner = (Integer) filterMap.get("owner");
final Long period = (Long) filterMap.get("period");
SelectConditionStep cond = dsl.select().from(METADATA).where(METADATA.MD_COMPLETION.between(minCompletion, maxCompletion));
if (owner != null) {
cond = cond.and(METADATA.OWNER.eq(owner));
}
if (period != null) {
cond = cond.and(METADATA.DATESTAMP.greaterOrEqual(period));
}
return dsl.fetchCount(cond);
}
@Override
public int countTotalMetadata(final Map<String,Object> filterMap) {
final Integer owner = (Integer) filterMap.get("owner");
final Long period = (Long) filterMap.get("period");
SelectJoinStep select = dsl.select().from(METADATA);
SelectConditionStep cond = null;
if (owner != null) {
cond = select.where(METADATA.OWNER.eq(owner));
select = null;
}
if (period != null) {
if (select == null) {
cond = cond.and(METADATA.DATESTAMP.greaterOrEqual(period));
} else {
cond = select.where(METADATA.DATESTAMP.greaterOrEqual(period));
select = null;
}
}
if (select != null) {
return dsl.fetchCount(select);
} else {
return dsl.fetchCount(cond);
}
}
@Override
public int countValidated(boolean status, final Map<String,Object> filterMap) {
final Integer owner = (Integer) filterMap.get("owner");
final Long period = (Long) filterMap.get("period");
final String validationReq = (String) filterMap.get("validation_required");
SelectConditionStep cond = dsl.select().from(METADATA).where(METADATA.IS_VALIDATED.equal(status));
if (owner != null) {
cond = cond.and(METADATA.OWNER.eq(owner));
}
if (period != null) {
cond = cond.and(METADATA.DATESTAMP.greaterOrEqual(period));
}
if (validationReq != null) {
cond = cond.and(METADATA.VALIDATION_REQUIRED.eq(validationReq));
}
return dsl.fetchCount(cond);
}
@Override
public int countPublished(boolean status, final Map<String,Object> filterMap) {
final Integer owner = (Integer) filterMap.get("owner");
final Long period = (Long) filterMap.get("period");
final Boolean validated = (Boolean) filterMap.get("validated");
SelectConditionStep cond = dsl.select().from(METADATA).where(METADATA.IS_PUBLISHED.equal(status));
if (owner != null) {
cond = cond.and(METADATA.OWNER.eq(owner));
}
if (period != null) {
cond = cond.and(METADATA.DATESTAMP.greaterOrEqual(period));
}
if(validated != null) {
cond = cond.and(METADATA.IS_VALIDATED.equal(validated));
}
return dsl.fetchCount(cond);
}
@Override
@Transactional
public void setValidationRequired(int id, String state, String validationState) {
UpdateSetFirstStep<MetadataRecord> update = dsl.update(METADATA);
update.set(METADATA.VALIDATION_REQUIRED, state)
.set(METADATA.VALIDATED_STATE, validationState).where(METADATA.ID.eq(id)).execute();
}
@Override
@Transactional(propagation = Propagation.MANDATORY)
public void denyValidation(int id, String comment) {
UpdateSetFirstStep<MetadataRecord> update = dsl.update(METADATA);
update.set(METADATA.VALIDATION_REQUIRED, "REJECTED")
.set(METADATA.COMMENT, comment).where(METADATA.ID.eq(id)).execute();
}
@Override
public boolean existInternalMetadata(String metadataID, boolean includeService, boolean onlyPublished) {
SelectConditionStep query = dsl.select(METADATA.ID).from(METADATA)
.where(METADATA.METADATA_ID.eq(metadataID));
if (!includeService) {
query = query.and(METADATA.SERVICE_ID.isNull());
}
if (onlyPublished) {
query = query.and(METADATA.IS_PUBLISHED.eq(Boolean.TRUE));
}
return query.fetchOne() != null;
}
}