package org.constellation.database.impl.repository; import org.constellation.database.api.jooq.tables.pojos.Data; import org.constellation.database.api.jooq.tables.pojos.Sensor; import org.constellation.database.api.jooq.tables.records.SensorRecord; import org.constellation.database.api.pojo.SensorReference; import org.constellation.database.api.repository.SensorRepository; import org.jooq.Field; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.List; import static org.constellation.database.api.jooq.Tables.DATA; import static org.constellation.database.api.jooq.Tables.SENSOR; import static org.constellation.database.api.jooq.Tables.SENSORED_DATA; @Component public class JooqSensorRepository extends AbstractJooqRespository<SensorRecord, Sensor> implements SensorRepository { public static final Field[] REFERENCE_FIELDS = new Field[]{ SENSOR.ID.as("id"), SENSOR.IDENTIFIER.as("identifier")}; public JooqSensorRepository() { super(Sensor.class, SENSOR); } @Override public List<String> getLinkedSensors(Data data) { return dsl.select(SENSOR.IDENTIFIER).from(SENSOR).join(SENSORED_DATA).onKey() .where(SENSORED_DATA.DATA.eq(data.getId())).fetch(SENSOR.IDENTIFIER); } @Override public List<Data> getLinkedDatas(Sensor sensor) { return dsl.select(DATA.fields()).from(DATA).join(SENSORED_DATA).onKey() .where(SENSORED_DATA.SENSOR.eq(sensor.getId())).fetchInto(Data.class); } @Override public Sensor findByIdentifier(String identifier) { return dsl.select().from(SENSOR).where(SENSOR.IDENTIFIER.eq(identifier)).fetchOneInto(Sensor.class); } @Override public List<Sensor> getChildren(Sensor sensor) { return dsl.select().from(SENSOR).where(SENSOR.PARENT.eq(sensor.getIdentifier())).fetchInto(Sensor.class); } @Override public List<Sensor> findAll() { return dsl.select().from(SENSOR).fetchInto(Sensor.class); } @Override @Transactional(propagation = Propagation.MANDATORY) public void delete(String identifier) { dsl.delete(SENSOR).where(SENSOR.IDENTIFIER.eq(identifier)).execute(); } @Override @Transactional(propagation = Propagation.MANDATORY) public void linkDataToSensor(Integer dataId , Integer sensorId) { dsl.insertInto(SENSORED_DATA).set(SENSORED_DATA.DATA, dataId).set(SENSORED_DATA.SENSOR, sensorId).execute(); } @Override @Transactional(propagation = Propagation.MANDATORY) public void unlinkDataToSensor(Integer dataId, Integer sensorId) { dsl.delete(SENSORED_DATA).where(SENSORED_DATA.DATA.eq(dataId)).and(SENSORED_DATA.SENSOR.eq(sensorId)).execute(); } @Override @Transactional(propagation = Propagation.MANDATORY) public Sensor create(Sensor sensor) { SensorRecord sensorRecord = dsl.newRecord(SENSOR); sensorRecord.from(sensor); sensorRecord.store(); return sensorRecord.into(Sensor.class); } @Override @Transactional(propagation = Propagation.MANDATORY) public void update(Sensor sensor) { dsl.update(SENSOR) .set(SENSOR.IDENTIFIER, sensor.getIdentifier()) .set(SENSOR.METADATA, sensor.getMetadata()) .set(SENSOR.OWNER, sensor.getOwner()) .set(SENSOR.PARENT, sensor.getParent()) .set(SENSOR.TYPE, sensor.getType()) .set(SENSOR.DATE, sensor.getDate()) .where(SENSOR.ID.eq(sensor.getId())) .execute(); } @Override public boolean existsById(int sensorId) { return dsl.selectCount().from(SENSOR) .where(SENSOR.ID.eq(sensorId)) .fetchOne(0, Integer.class) > 0; } @Override public boolean existsByIdentifier(String sensorId) { return dsl.selectCount().from(SENSOR) .where(SENSOR.IDENTIFIER.eq(sensorId)) .fetchOne(0, Integer.class) > 0; } @Override public List<SensorReference> fetchByDataId(int dataId) { return dsl.select(REFERENCE_FIELDS).from(SENSOR) .join(SENSORED_DATA).on(SENSORED_DATA.SENSOR.eq(SENSOR.ID)) .where(SENSORED_DATA.DATA.eq(dataId)) .fetchInto(SensorReference.class); } }