/*
* The MIT License (MIT)
*
* Copyright (c) 2007-2015 Broad Institute
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.broad.igv.dev.db;
import junit.framework.Assert;
import org.broad.igv.feature.tribble.IGVBEDCodec;
import org.broad.igv.util.ResourceLocator;
import org.broad.igv.util.TestUtils;
import org.broad.igv.variant.vcf.VCFVariant;
import htsjdk.tribble.AbstractFeatureReader;
import htsjdk.tribble.AsciiFeatureCodec;
import htsjdk.tribble.Feature;
import org.junit.Test;
import java.io.File;
import java.util.Iterator;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
public class SQLCodecSourceTest {
private SQLCodecSource getUnigene(String path) {
AsciiFeatureCodec codec = new IGVBEDCodec();
String host = (new File(TestUtils.DATA_DIR)).getAbsolutePath();
String url = DBManager.createConnectionURL("sqlite", host, path, null);
ResourceLocator locator = new ResourceLocator(url);
String tableName = "unigene";
DBProfile.DBTable table = new DBProfile.DBTable(locator, tableName, "n/a", null, "chrom", "chromStart", "chromEnd", 1, Integer.MAX_VALUE, null, null, null);
SQLCodecSource reader = new SQLCodecSource(table, codec);
return reader;
}
//Check that querying returns sorted features
@Test
public void testQueryBEDUnsorted() throws Exception {
String path = "sql/Unigene.unsorted.db";
SQLCodecSource reader = getUnigene(path);
reader.setFeatureWindowSize(Integer.MAX_VALUE / 2);
Iterator<Feature> features = reader.getFeatures("chr2", 0, Integer.MAX_VALUE / 4);
assertNotNull(features);
int count = TestUtils.assertFeatureIteratorSorted(features);
assertEquals(71, count);
}
//Check that iterating returns sorted features
@Test
public void testIterateBEDUnsorted() throws Exception {
String path = "sql/Unigene.unsorted.db";
SQLCodecSource reader = getUnigene(path);
Iterator<Feature> features = reader.iterator();
int count = TestUtils.assertFeatureIteratorSorted(features);
assertEquals(71, count);
}
@Test
public void testLoadBED() throws Exception {
AsciiFeatureCodec codec = new IGVBEDCodec();
String path = "sql/unigene.db";
SQLCodecSource reader = getUnigene(path);
Iterator<Feature> SQLFeatures = reader.iterator();
String bedFile = TestUtils.DATA_DIR + "/bed/Unigene.sample.bed";
AbstractFeatureReader bfr = AbstractFeatureReader.getFeatureReader(bedFile, codec, false);
Iterator<Feature> fileFeatures = bfr.iterator();
int count = 0;
while (SQLFeatures.hasNext()) {
Feature f = SQLFeatures.next();
Feature fileFeature = fileFeatures.next();
TestUtils.assertFeaturesEqual(fileFeature, f);
count++;
}
Assert.assertEquals(72, count);
}
//Don't support reordering by index
//@Test
public void testLoadReorderedColumnsIndex() throws Exception {
String profilePath = TestUtils.DATA_DIR + "sql/unsorted.colsreordered.byindex.dbxml";
tstLoadReorderedColumns(profilePath);
}
@Test
public void testLoadReorderedColumnsLabel() throws Exception {
String profilePath = TestUtils.DATA_DIR + "sql/unsorted.colsreordered.bylabel.dbxml";
tstLoadReorderedColumns(profilePath);
}
public void tstLoadReorderedColumns(String profilePath) throws Exception {
SQLCodecSource source0 = SQLCodecSource.getFromProfile(profilePath, "unigene");
assertNotNull(source0);
SQLCodecSource source1 = getUnigene("sql/Unigene.unsorted.db");
Iterator<Feature> features0 = source0.iterator();
Iterator<Feature> features1 = source1.iterator();
while (features0.hasNext()) {
Feature act_feat = features0.next();
Feature exp_feat = features1.next();
TestUtils.assertFeaturesEqual(exp_feat, act_feat);
}
}
private SQLCodecSource getVCFsrc() throws Exception {
String profilePath = TestUtils.DATA_DIR + "sql/SRP32_v40.dbxml";
return SQLCodecSource.getFromProfile(profilePath, "SRP32_v40");
}
@Test
public void testIterateVCF() throws Exception {
int featCount = 0;
Iterator<Feature> iterator = getVCFsrc().iterator();
while (iterator.hasNext()) {
iterator.next();
featCount++;
}
assertEquals(3963, featCount);
}
@Test
public void testQueryVCF() throws Exception {
SQLCodecSource source = getVCFsrc();
//Target row:
//1 201813161 rs2248941 T C . PASS AA=T;DP=167 GT:GQ:DP 0|1:100:56 0|0:98:33 0|0:100:39
int start = 201813161 - 1;
int end = start + 2;
int count = 0;
Iterator<Feature> iterator = source.getFeatures("1", start, end);
while (iterator.hasNext()) {
VCFVariant feat = (VCFVariant) iterator.next();
assertEquals("1", feat.getChr());
assertEquals(start, feat.getStart());
assertEquals("rs2248941", feat.getID());
assertEquals(start + 1, feat.getEnd());
count++;
}
assertEquals(1, count);
}
}