/*
* #%L
* gitools-core
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.matrix.model;
import com.google.common.base.Joiner;
import org.gitools.api.matrix.*;
import org.gitools.matrix.model.iterable.IdentifierSourceIterable;
import org.gitools.matrix.model.iterable.ValueSourceIterable;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class MatrixPosition implements IMatrixPosition {
private IMatrix matrix;
private MatrixPosition parentPosition;
private MatrixDimensionKey[] dimensions;
private String[] identifiers;
private Map<MatrixDimensionKey, Integer> positions;
public MatrixPosition(MatrixPosition position) {
this.parentPosition = position;
this.identifiers = Arrays.copyOf(position.identifiers, position.identifiers.length);
//0this.identifiers = position.identifiers;
this.matrix = position.matrix;
this.dimensions = position.dimensions;
this.positions = position.positions;
}
public MatrixPosition(IMatrix matrix) {
super();
this.matrix = matrix;
this.dimensions = matrix.getDimensionKeys();
this.identifiers = new String[dimensions.length];
for (int i = 0; i < dimensions.length; i++) {
this.identifiers[i] = matrix.getDimension(dimensions[i]).iterator().next();
}
this.positions = new HashMap<>(dimensions.length);
for (int i = 0; i < dimensions.length; i++) {
this.positions.put(dimensions[i], i);
}
}
@Override
public IMatrix getMatrix() {
return matrix;
}
@Override
public String get(IMatrixDimension dimension) {
return get(dimension.getId());
}
@Override
public String get(MatrixDimensionKey dimension) {
return identifiers[positions.get(dimension)];
}
@Override
public IMatrixPosition set(IMatrixDimension dimension, String identifier) {
return set(dimension.getId(), identifier);
}
@Override
public MatrixPosition set(MatrixDimensionKey dimension, String identifier) {
if (identifier != null) {
identifiers[positions.get(dimension)] = identifier;
if (parentPosition != null) {
parentPosition.identifiers[positions.get(dimension)] = identifier;
}
}
return this;
}
@Override
public String[] toVector() {
return identifiers;
}
public MatrixPosition set(String... identifiers) {
assert identifiers.length == dimensions.length : "This matrix position has " + dimensions.length + " and your identifier vector " + identifiers.length;
this.identifiers = Arrays.copyOf(identifiers, identifiers.length);
if (parentPosition != null) {
parentPosition.identifiers = Arrays.copyOf(identifiers, identifiers.length);
}
return this;
}
@Override
public IMatrixIterable<String> iterate(IMatrixDimension dimension) {
return new IdentifierSourceIterable(this, dimension);
}
@Override
public <T> IMatrixIterable<T> iterate(ILayerAdapter<T> layerAdapter, IMatrixDimension... dimension) {
return new AdapterSourceIterable<>(this, layerAdapter, dimension);
}
@Override
public <T> IMatrixIterable<T> iterate(IMatrixLayer<T> layer, IMatrixDimension... dimension) {
return new ValueSourceIterable<>(this, layer, dimension);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MatrixPosition that = (MatrixPosition) o;
if (!Arrays.equals(identifiers, that.identifiers)) return false;
return true;
}
@Override
public int hashCode() {
return Arrays.hashCode(identifiers);
}
@Override
public String toString() {
return " (" + Joiner.on(",").join(identifiers) + ")";
}
}