package org.ovirt.engine.core.dao;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import javax.inject.Named;
import javax.inject.Singleton;
import org.ovirt.engine.core.common.businessentities.storage.DiskImageDynamic;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.dbbroker.MapSqlParameterMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
/**
* JDBC template based implementation of {@link DiskImageDynamicDao}.
*/
@Named
@Singleton
public class DiskImageDynamicDaoImpl extends MassOperationsGenericDao<DiskImageDynamic, Guid>
implements DiskImageDynamicDao {
public DiskImageDynamicDaoImpl() {
super("disk_image_dynamic");
setProcedureNameForGet("Getdisk_image_dynamicByimage_id");
setProcedureNameForGetAll("GetAllFromdisk_image_dynamic");
}
@Override
protected MapSqlParameterSource createIdParameterMapper(Guid id) {
return getCustomMapSqlParameterSource()
.addValue("image_id", id);
}
@Override
protected MapSqlParameterSource createFullParametersMapper(DiskImageDynamic entity) {
return createIdParameterMapper(entity.getId())
.addValue("read_rate", entity.getReadRate())
.addValue("write_rate", entity.getWriteRate())
.addValue("actual_size", entity.getActualSize())
.addValue("read_latency_seconds", entity.getReadLatency())
.addValue("write_latency_seconds", entity.getWriteLatency())
.addValue("flush_latency_seconds", entity.getFlushLatency());
}
@Override
protected RowMapper<DiskImageDynamic> createEntityRowMapper() {
return (rs, rowNum) -> {
DiskImageDynamic entity = new DiskImageDynamic();
entity.setId(getGuidDefaultEmpty(rs, "image_id"));
entity.setReadRate((Integer) rs.getObject("read_rate"));
entity.setWriteRate((Integer) rs.getObject("write_rate"));
entity.setActualSize(rs.getLong("actual_size"));
entity.setReadLatency(rs.getObject("read_latency_seconds") != null ? rs.getDouble("read_latency_seconds")
: null);
entity.setWriteLatency(rs.getObject("write_latency_seconds") != null ? rs.getDouble("write_latency_seconds")
: null);
entity.setFlushLatency(rs.getObject("flush_latency_seconds") != null ? rs.getDouble("flush_latency_seconds")
: null);
return entity;
};
}
public MapSqlParameterMapper<Pair<Guid, DiskImageDynamic>> getBatchImageGroupMapper() {
return entity -> {
Guid vmId = entity.getFirst();
DiskImageDynamic diskImageDynamic = entity.getSecond();
return new MapSqlParameterSource()
.addValue("vm_id", vmId)
.addValue("image_group_id", diskImageDynamic.getId())
.addValue("read_rate", diskImageDynamic.getReadRate())
.addValue("write_rate", diskImageDynamic.getWriteRate())
.addValue("actual_size", diskImageDynamic.getActualSize())
.addValue("read_latency_seconds", diskImageDynamic.getReadLatency())
.addValue("write_latency_seconds", diskImageDynamic.getWriteLatency())
.addValue("flush_latency_seconds", diskImageDynamic.getFlushLatency());
};
}
public static List<Pair<Guid, DiskImageDynamic>> sortDiskImageDynamicForUpdate(Collection<Pair<Guid,
DiskImageDynamic>> diskImageDynamicForVm) {
List<Pair<Guid, DiskImageDynamic>> sortedDisks = new ArrayList<>();
sortedDisks.addAll(diskImageDynamicForVm);
sortedDisks.sort(Comparator.comparing(x -> x.getSecond().getId()));
return sortedDisks;
}
@Override
public void updateAllDiskImageDynamicWithDiskIdByVmId(Collection<Pair<Guid, DiskImageDynamic>> diskImageDynamicForVm) {
getCallsHandler().executeStoredProcAsBatch("Updatedisk_image_dynamic_by_disk_id_and_vm_id",
sortDiskImageDynamicForUpdate(diskImageDynamicForVm), getBatchImageGroupMapper());
}
}