package org.molgenis.matrix.component.test; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Logger; import org.molgenis.framework.db.Database; import org.molgenis.framework.db.DatabaseException; import org.molgenis.framework.db.QueryRule.Operator; import org.molgenis.matrix.component.SliceablePhenoMatrix; import org.molgenis.organization.Investigation; import org.molgenis.pheno.Individual; import org.molgenis.pheno.Measurement; import org.molgenis.pheno.Observation; import org.molgenis.pheno.ObservedValue; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import app.DatabaseFactory; public class TestSliceablePhenoMatrix { // SETTINGS! String properties = "apps/animaldb/org/molgenis/animaldb/animaldb.properties"; // data and metadata private List<Measurement> features = new ArrayList<Measurement>(); private List<Individual> targets = new ArrayList<Individual>(); private List<ObservedValue> values = new ArrayList<ObservedValue>(); private Investigation investigation; // the matrix private SliceablePhenoMatrix<Individual, Measurement> matrix; // the logger Logger logger = Logger.getLogger(this.getClass().getSimpleName()); @BeforeClass public void setUp() throws DatabaseException, FileNotFoundException, IOException { BasicConfigurator.configure(); Database db = DatabaseFactory.create(properties); this.generateData(db); matrix = new SliceablePhenoMatrix<Individual, Measurement>(Individual.class, Measurement.class); // different row and col limit to make sure we test different things matrix.setColLimit(5); logger.debug("++++++++++SETUP COMPLETE++++++++++++"); } @Test public void testRowHeaders(Database db) throws Exception { matrix.reset(); logger.debug("testRowHeaders"); List<Individual> rowHeaders = matrix.getRowHeaders(); Assert.assertEquals(rowHeaders.get(0).getIdValue(), targets.get(0).getIdValue()); Assert.assertEquals(rowHeaders.size(), matrix.getRowLimit()); // more the row offset // matrix.setRowOffset(10); // Assert.assertEquals(rowHeaders.get(0), targets.get(10)); } @Test public void testColHeaders(Database db) throws Exception { matrix.reset(); logger.debug("testColHeaders"); // we expect feature index in reverse order List<Measurement> colHeaders = matrix.getColHeaders(); Assert.assertEquals(colHeaders.size(), matrix.getColLimit()); Assert.assertEquals(colHeaders.get(0), features.get(0)); } @Test public void testRowIndices(Database db) throws Exception { matrix.reset(); logger.debug("testRowIndics"); // we expect feature index in reverse order List<Integer> rowIndices = matrix.getRowIndices(); Assert.assertEquals(rowIndices.size(), matrix.getRowLimit()); Assert.assertEquals(rowIndices.get(0), targets.get(0).getIdValue()); } @Test public void testColIndices(Database db) throws Exception { matrix.reset(); logger.debug("testColIndices"); // we expect feature index in reverse order List<Integer> colIndices = matrix.getColIndices(); Assert.assertEquals(colIndices.get(0), features.get(0).getIdValue()); Assert.assertEquals(colIndices.size(), matrix.getColLimit()); } @Test public void testValues(Database db) throws Exception { matrix.reset(); logger.debug("testValues: load data"); List<? extends Observation>[][] valueMatrix = matrix.getValueLists(); logger.debug("testValues: verifying..."); for (Integer row = 0; row < matrix.getRowLimit(); row++) { for (Integer col = 0; col < matrix.getColLimit(); col++) { List<? extends Observation> e = valueMatrix[row][col]; Assert.assertEquals(e.get(0).get(ObservedValue.VALUE), this.values .get(row * matrix.getColCount() + col).getValue()); // TODO // Assert.assertEquals(e.get(0), col); // Assert.assertEquals(e.getValue(), "val"+row+","+col); } } } @Test public void testRowHeaderFilters(Database db) throws Exception { matrix.reset(); logger.debug("testRowHeaderFilters"); // check for first one greater then matrix.sliceByRowProperty(Individual.ID, Operator.GREATER, targets.get(5).getId()); Assert.assertEquals(matrix.getRowHeaders().get(0).getIdValue(), targets.get(6).getId()); // repeat for sliceByRowIndex (wich should work identical to above) matrix.reset(); matrix.sliceByRowIndex(Operator.GREATER, targets.get(5).getId()); Assert.assertEquals(matrix.getRowHeaders().get(0).getIdValue(), targets.get(6).getId()); // reverse sort, now we should get last ID first matrix.sliceByRowProperty(Individual.ID, Operator.SORTDESC, null); Assert.assertEquals(matrix.getRowHeaders().get(0).getIdValue(), targets.get(targets.size() - 1).getIdValue()); } @Test public void testColValuePropertyFilters(Database db) throws Exception { matrix.reset(); logger.debug("testColValuePropertyFilters"); // filter on 5th column (values 'val4,4' and higher), we expect first // result target to be row5 matrix.sliceByColValues(features.get(5), Operator.GREATER, "val44"); matrix.sortCol(features.get(5).getId(), ObservedValue.VALUE, Operator.SORTASC); Assert.assertEquals(matrix.getRowHeaders().get(0), targets.get(5)); // repeate but now explicity property chosing matrix.reset(); matrix.sliceByColValueProperty(features.get(5), ObservedValue.VALUE, Operator.GREATER, "val44"); matrix.sortCol(features.get(5).getId(), ObservedValue.VALUE, Operator.SORTASC); Assert.assertEquals(matrix.getRowHeaders().get(0).getIdValue(), targets.get(5).getIdValue()); } @Test public void testColCount(Database db) throws Exception { matrix.reset(); logger.debug("testColCount"); Assert.assertEquals(matrix.getColCount(), (Integer) features.size()); } @Test public void testRowCount(Database db) throws Exception { matrix.reset(); logger.debug("testRowCount"); Assert.assertEquals(matrix.getRowCount(), (Integer) targets.size()); } @Test public void testRowOffset(Database db) throws Exception { matrix.reset(); logger.debug("testRowOffset"); matrix.setRowOffset(10); Assert.assertEquals(matrix.getRowIndices().get(0), targets.get(10).getIdValue()); Assert.assertEquals(matrix.getRowHeaders().get(0), targets.get(10)); } @AfterClass public void tearDown() throws DatabaseException, FileNotFoundException, IOException { logger.debug("++++++++++TEST COMPLETE, REMOVING DATA ++++++++++++"); Database db = DatabaseFactory.create(properties); try { db.beginTx(); db.remove(values); db.remove(targets); db.remove(features); db.remove(investigation); db.commitTx(); } catch (DatabaseException e) { db.rollbackTx(); } logger.debug("done"); } private void generateData(Database db) throws DatabaseException { logger.debug("generating test data"); int rowCount = 100; int colCount = 20; try { db.beginTx(); // generate data investigation = new Investigation(); investigation.setName("Test" + System.currentTimeMillis()); db.add(investigation); // measurements for (int i = 0; i < colCount; i++) { Measurement meas = new Measurement(); meas.setInvestigation(investigation.getId()); meas.setName("meas" + i); // to help compile try { meas.set("Owns", 2); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } features.add(meas); } db.add(features); features = db.find(Measurement.class); // individuals for (int i = 0; i < rowCount; i++) { Individual inv = new Individual(); inv.setInvestigation(investigation.getId()); inv.setName("inv" + i); try { inv.set("Owner", 2); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } targets.add(inv); } db.add(this.targets); targets = db.find(Individual.class); // the matrix, for testing purpose in reverse order int rowIndex = 0; for (int row = 0; row < targets.size(); row++) { int colIndex = 0; for (int col = 0; col < features.size(); col++) { ObservedValue td = new ObservedValue(); td.setFeature(features.get(col)); td.setTarget(targets.get(row)); td.setValue("val" + row + "," + col); values.add(td); } rowIndex++; } db.add(values); db.commitTx(); } catch (DatabaseException e) { e.printStackTrace(); db.rollbackTx(); throw new RuntimeException("database problem"); } } }