package com.tesora.dve.distribution;
/*
* #%L
* Tesora Inc.
* Database Virtualization Engine
* %%
* Copyright (C) 2011 - 2014 Tesora Inc.
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.hibernate.annotations.ForeignKey;
import com.tesora.dve.common.catalog.StorageGroupGeneration;
import com.tesora.dve.exceptions.PEException;
@Entity
@Table(name="generation_key_range")
public class GenerationKeyRange {
@Id
@GeneratedValue
@Column(name = "key_gen_id")
private int id;
@SuppressWarnings("unused")
private int version;
@ForeignKey(name="fk_gen_key_range_range")
@ManyToOne(optional = false, fetch=FetchType.EAGER)
@JoinColumn(name = "range_id")
private DistributionRange distributionRange;
@ForeignKey(name="fk_gen_key_range_gen")
@ManyToOne(optional = false)
@JoinColumn(name = "generation_id")
private StorageGroupGeneration generation;
@Lob @Column(name="range_start", nullable=false)
String rangeStartPersisted;
@Lob @Column(name="range_end", nullable=false)
String rangeEndPersisted;
@Transient
RangeLimit rangeStart = null;
@Transient
RangeLimit rangeEnd;
public GenerationKeyRange() {
}
public GenerationKeyRange(DistributionRange distRange, StorageGroupGeneration gen, KeyValue dvStart, KeyValue dvEnd) throws PEException {
distributionRange = distRange;
generation = gen;
version = gen.getVersion();
setRange(dvStart, dvEnd);
}
public DistributionRange getDistributionRange() {
return distributionRange;
}
public StorageGroupGeneration getStorageGroupGeneration() {
return generation;
}
public boolean isInRange(IKeyValue key) throws PEException {
extractRange();
return key.compare(rangeStart) >= 0 && key.compare(rangeEnd) <= 0;
}
/**
* @param start
* @param end
* @throws PEException
*/
public void setRange(KeyValue start, KeyValue end) throws PEException {
rangeStart = new RangeLimit(start);
rangeEnd = new RangeLimit(end);
persistRange();
}
private void persistRange() {
rangeStartPersisted = rangeStart.toString();
rangeEndPersisted = rangeEnd.toString();
}
private void extractRange() throws PEException {
if (rangeStart == null) {
rangeStart = RangeLimit.parseLimit(rangeStartPersisted);
rangeEnd = RangeLimit.parseLimit(rangeEndPersisted);
}
}
public void mergeRange(KeyValue dvStart, KeyValue dvEnd) throws PEException {
extractRange();
if (dvStart.compare(rangeStart) < 0)
rangeStart = new RangeLimit(dvStart);
if (dvEnd.compare(rangeEnd) > 0)
rangeEnd = new RangeLimit(dvEnd);
persistRange();
}
@Override
public String toString() {
try {
extractRange();
return this.getClass().getSimpleName()+"("+distributionRange+",["+rangeStart+","+rangeEnd+"])";
} catch (PEException e) {
return this.getClass().getSimpleName();
}
}
}