/* * Copyright (c) 2017 OBiBa. All rights reserved. * * This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.obiba.magma.datasource.jdbc; import java.util.TreeSet; import java.util.stream.Collectors; import javax.sql.DataSource; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.primitives.Ints; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.obiba.core.test.spring.Dataset; import org.obiba.core.test.spring.DbUnitAwareTestExecutionListener; import org.obiba.magma.Category; import org.obiba.magma.NoSuchVariableException; import org.obiba.magma.Timestamps; import org.obiba.magma.Value; import org.obiba.magma.ValueSet; import org.obiba.magma.ValueTable; import org.obiba.magma.ValueTableWriter; import org.obiba.magma.ValueTableWriter.ValueSetWriter; import org.obiba.magma.ValueTableWriter.VariableWriter; import org.obiba.magma.Variable; import org.obiba.magma.VariableEntity; import org.obiba.magma.VectorSource; import org.obiba.magma.support.VariableEntityBean; import org.obiba.magma.test.AbstractMagmaTest; import org.obiba.magma.test.SchemaTestExecutionListener; import org.obiba.magma.test.TestSchema; import org.obiba.magma.type.DecimalType; import org.obiba.magma.type.IntegerType; import org.obiba.magma.type.TextType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; import org.springframework.test.context.support.DirtiesContextTestExecutionListener; import org.springframework.test.context.transaction.TransactionConfiguration; import org.springframework.test.context.transaction.TransactionalTestExecutionListener; import com.google.common.collect.Sets; import static org.fest.assertions.api.Assertions.assertThat; import static org.fest.assertions.api.Assertions.fail; @SuppressWarnings({ "ReuseOfLocalVariable", "OverlyLongMethod", "PMD.NcssMethodCount" }) @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/test-spring-context.xml") @TransactionConfiguration @TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class, SchemaTestExecutionListener.class, DbUnitAwareTestExecutionListener.class }) public class JdbcDatasourceTest extends AbstractMagmaTest { @Rule public final ExpectedException exception = ExpectedException.none(); @Autowired private DataSource dataSource; @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-nometa.sql", afterSchema = "schema-notables.sql") @Dataset(filenames = "JdbcDatasourceTest-nometa.xml") @Test public void testCreateDatasourceFromExistingDatabase() { JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource", dataSource, JdbcDatasourceSettings.newSettings("Participant").mappedTables(Sets.newHashSet("BONE_DENSITY")).build()); jdbcDatasource.initialise(); createDatasourceFromExistingDatabase(jdbcDatasource); jdbcDatasource.dispose(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-nometa-where.sql", afterSchema = "schema-notables.sql") @Dataset(filenames = "JdbcDatasourceTest-nometa.xml") @Test public void testCreateDatasourceFromExistingDatabaseWithWhereClause() { testCreateDatasourceFromExistingDatabaseWithTableSettings(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-nometa-repeatables.sql", afterSchema = "schema-notables.sql") @Dataset(filenames = "JdbcDatasourceTest-nometa-repeatables.xml") @Test public void testCreateDatasourceFromExistingDatabaseWithDetectedMultilines() { testCreateDatasourceFromExistingDatabaseWithTableSettings(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-nometa-repeatables.sql", afterSchema = "schema-notables.sql") @Dataset(filenames = "JdbcDatasourceTest-nometa-repeatables.xml") @Test public void testCreateDatasourceFromExistingDatabaseWithTableMultilines() { JdbcValueTableSettings tableSettings = JdbcValueTableSettings.newSettings("BONE_DENSITY").entityType("Participant") .entityIdentifierColumn("PART_ID").multilines().build(); JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource", dataSource, JdbcDatasourceSettings.newSettings("Participant").mappedTables(Sets.newHashSet("BONE_DENSITY")).tableSettings(Sets.newHashSet(tableSettings)).build()); jdbcDatasource.initialise(); createDatasourceFromExistingDatabase(jdbcDatasource); jdbcDatasource.dispose(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-nometa-repeatables.sql", afterSchema = "schema-notables.sql") @Dataset(filenames = "JdbcDatasourceTest-nometa-repeatables.xml") @Test public void testCreateDatasourceFromExistingDatabaseWithDatasourceMultilines() { JdbcValueTableSettings tableSettings = JdbcValueTableSettings.newSettings("BONE_DENSITY").entityType("Participant") .entityIdentifierColumn("PART_ID").build(); JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource", dataSource, JdbcDatasourceSettings.newSettings("Participant").mappedTables(Sets.newHashSet("BONE_DENSITY")) .tableSettings(Sets.newHashSet(tableSettings)).multilines().build()); jdbcDatasource.initialise(); createDatasourceFromExistingDatabase(jdbcDatasource); jdbcDatasource.dispose(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-meta.sql", afterSchema = "schema-notables.sql") @Dataset(filenames = "JdbcDatasourceTest.xml") @Test @Ignore //TODO: fix dbunit config in obiba-commons to quote identifier names public void testCreateDatasourceFromExistingDatabaseUsingMetadataTables() { JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource", dataSource, "Participant", true); jdbcDatasource.initialise(); createDatasourceFromExistingDatabase(jdbcDatasource); ValueTable valueTable = jdbcDatasource.getValueTable("BONE_DENSITY"); Variable bdVar = valueTable.getVariable("BD"); Variable bdVar2 = valueTable.getVariable("BD_2"); // Verify variable attributes. assertThat(bdVar.hasAttribute("description")).isTrue(); assertThat(bdVar.getAttributeValue("description").toString()).isEqualTo("BD description"); assertThat(bdVar2.hasAttribute("description")).isTrue(); assertThat(bdVar2.getAttributeValue("description").toString()).isEqualTo("BD_2 description"); // Verify categories. assertThat(hasCategory(bdVar, "PNA")).isTrue(); assertThat(hasCategory(bdVar, "DNK")).isTrue(); jdbcDatasource.dispose(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-nometa.sql", afterSchema = "schema-notables.sql") @Dataset(filenames = "JdbcDatasourceTest-nometa.xml") @Test public void test_vectorSource() { JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource", dataSource, JdbcDatasourceSettings.newSettings("Participant").mappedTables(Sets.newHashSet("BONE_DENSITY")).build()); jdbcDatasource.initialise(); createDatasourceFromExistingDatabase(jdbcDatasource); ValueTable valueTable = jdbcDatasource.getValueTable("BONE_DENSITY"); VectorSource bdVar = valueTable.getVariableValueSource("BD").asVectorSource(); VectorSource bdVar2 = valueTable.getVariableValueSource("BD_2").asVectorSource(); // Verify variable attributes. assertThat(bdVar).isNotNull(); assertThat(bdVar2).isNotNull(); Iterable<Value> values = bdVar.getValues(new TreeSet<>(valueTable.getVariableEntities())); assertThat(values).hasSize(2); values = bdVar2.getValues(new TreeSet<>(valueTable.getVariableEntities())); assertThat(values).hasSize(2); jdbcDatasource.dispose(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-nometa-where.sql", afterSchema = "schema-notables.sql") @Dataset(filenames = "JdbcDatasourceTest-nometa-where.xml") @Test public void test_vectorSourceWithWhereClause() { JdbcValueTableSettings tableSettings = JdbcValueTableSettings.newSettings("BONE_DENSITY") .entityIdentifierColumn("PART_ID").entityIdentifiersWhere("VISIT_ID = 2").build(); JdbcDatasourceSettings settings = JdbcDatasourceSettings.newSettings("Participant").tableSettings(Sets.newHashSet(tableSettings)).build(); JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource", dataSource, settings); jdbcDatasource.initialise(); createDatasourceFromExistingDatabase(jdbcDatasource); ValueTable valueTable = jdbcDatasource.getValueTable("BONE_DENSITY"); VectorSource bdVar = valueTable.getVariableValueSource("BD").asVectorSource(); VectorSource bdVar2 = valueTable.getVariableValueSource("BD_2").asVectorSource(); // Verify variable attributes. assertThat(bdVar).isNotNull(); assertThat(bdVar2).isNotNull(); Iterable<Value> values = bdVar.getValues(new TreeSet<>(valueTable.getVariableEntities())); assertThat(values).hasSize(2); values = bdVar2.getValues(new TreeSet<>(valueTable.getVariableEntities())); assertThat(values).hasSize(2); jdbcDatasource.dispose(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-nometa-where.sql", afterSchema = "schema-notables.sql") @Dataset(filenames = "JdbcDatasourceTest-nometa-where.xml") @Test public void test_datasourceWithSettingsFactory() { JdbcValueTableSettingsFactory tableSettingsFactory = JdbcValueTableSettingsFactory.newSettings("BONE_DENSITY", "VISIT_ID") .tableName("BD_").entityIdentifierColumn("PART_ID").build(); JdbcDatasourceSettings settings = JdbcDatasourceSettings.newSettings("Participant").tableSettingsFactories(Sets.newHashSet(tableSettingsFactory)).build(); JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource", dataSource, settings); jdbcDatasource.initialise(); assertThat(jdbcDatasource).isNotNull(); assertThat(jdbcDatasource.getName()).isEqualTo("my-datasource"); assertThat(jdbcDatasource.getValueTables()).hasSize(2); assertThat(jdbcDatasource.hasValueTable("BD_1")).isTrue(); assertThat(jdbcDatasource.hasValueTable("BD_2")).isTrue(); ValueTable bdTable = jdbcDatasource.getValueTable("BD_1"); assertThat(bdTable.getEntityType()).isEqualTo("Participant"); assertThat(bdTable.getVariableEntityCount()).isEqualTo(1); bdTable = jdbcDatasource.getValueTable("BD_2"); assertThat(bdTable.getEntityType()).isEqualTo("Participant"); assertThat(bdTable.getVariableEntityCount()).isEqualTo(2); jdbcDatasource.dispose(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-notables.sql", afterSchema = "schema-notables.sql") @Test public void testCreateDatasourceFromScratch() { // i.e., no existing database JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource-nodb", dataSource, "Participant", false); jdbcDatasource.initialise(); createDatasourceFromScratch(jdbcDatasource); jdbcDatasource.dispose(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-meta.sql", afterSchema = "schema-notables.sql") @Test public void testCreateDatasourceFromScratchUsingMetadataTables() { JdbcDatasourceSettings settings = JdbcDatasourceSettings.newSettings("Participant").useMetadataTables().multipleDatasources().build(); JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource-nodb", dataSource, settings); jdbcDatasource.initialise(); createDatasourceFromScratch(jdbcDatasource); jdbcDatasource.dispose(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-notables.sql", afterSchema = "schema-notables.sql") @Test public void test_Timestamped() { JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource-nodb", dataSource, getDataSourceSettings()); jdbcDatasource.initialise(); createDatasourceFromScratch(jdbcDatasource); ValueTable t = jdbcDatasource.getValueTables().iterator().next(); Timestamps ts = t.getTimestamps(); assertThat(ts).isNotNull(); assertThat(ts.getCreated()).isNotNull(); assertThat(ts.getCreated().isNull()).isFalse(); assertThat(ts.getLastUpdate()).isNotNull(); assertThat(ts.getLastUpdate().isNull()).isFalse(); jdbcDatasource.dispose(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-notables.sql") @Test public void testDropDatasource() { JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource-nodb", dataSource, getDataSourceSettings()); jdbcDatasource.initialise(); createDatasourceFromScratch(jdbcDatasource); jdbcDatasource.drop(); jdbcDatasource.dispose(); assertThat(jdbcDatasource.getValueTables()).isEmpty(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-notables.sql") @Test public void testRemoveValueSet() { JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource-nodb", dataSource, getDataSourceSettings()); jdbcDatasource.initialise(); createDatasourceFromScratch(jdbcDatasource); VariableEntity myEntity1 = new VariableEntityBean("Participant", "1"); try(ValueTableWriter writer = jdbcDatasource.createWriter("MY_TABLE", "Participant")) { try(ValueSetWriter vsWriter = writer.writeValueSet(myEntity1)) { vsWriter.remove(); } } ValueTable vt = jdbcDatasource.getValueTable("MY_TABLE"); assertThat(vt.getValueSets()).isEmpty(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-notables.sql") @Test public void testRemoveVariable() { JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource-nodb", dataSource, getDataSourceSettings()); jdbcDatasource.initialise(); createDatasourceFromScratch(jdbcDatasource); try(ValueTableWriter writer = jdbcDatasource.createWriter("MY_TABLE", "Participant")) { try(VariableWriter varWriter = writer.writeVariables()) { varWriter.removeVariable(jdbcDatasource.getValueTable("MY_TABLE").getVariable("MY_VAR1")); } } ValueTable vt = jdbcDatasource.getValueTable("MY_TABLE"); exception.expect(NoSuchVariableException.class); fail(String.format("Variable %s not removed.", vt.getVariable("MY_VAR1"))); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-notables.sql", afterSchema = "schema-notables.sql") @Test public void testValueSetCount() { JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource-nodb", dataSource, getDataSourceSettings()); jdbcDatasource.initialise(); createDatasourceFromScratch(jdbcDatasource); ValueTable vt = jdbcDatasource.getValueTable("MY_TABLE"); assertThat(vt.getValueSetCount()).isEqualTo(1); assertThat(vt.getVariableEntityCount()).isEqualTo(1); assertThat(vt.getVariableCount()).isEqualTo(2); jdbcDatasource.dispose(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-notables.sql", afterSchema = "schema-notables.sql") @Test public void testColumnsNormalized() { JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource-nodb", dataSource, getDataSourceSettings()); jdbcDatasource.initialise(); try(ValueTableWriter tableWriter = jdbcDatasource.createWriter("MY_TABLE", "Participant")) { // Write some variables. try(VariableWriter variableWriter = tableWriter.writeVariables()) { variableWriter.writeVariable(Variable.Builder.newVariable("test.MY_VAR1", IntegerType.get(), "Participant").build()); variableWriter.writeVariable(Variable.Builder.newVariable("test.MY_VAR2", DecimalType.get(), "Participant").build()); } // Write a value set. VariableEntity myEntity1 = new VariableEntityBean("Participant", "1"); try(ValueSetWriter valueSetWriter = tableWriter.writeValueSet(myEntity1)) { Variable myVar1 = jdbcDatasource.getValueTable("MY_TABLE").getVariable("test.MY_VAR1"); Variable myVar2 = jdbcDatasource.getValueTable("MY_TABLE").getVariable("test.MY_VAR2"); valueSetWriter.writeValue(myVar1, IntegerType.get().valueOf(77)); valueSetWriter.writeValue(myVar2, IntegerType.get().valueOf(78)); } } ValueTable vt = jdbcDatasource.getValueTable("MY_TABLE"); assertThat(vt.getValueSetCount()).isEqualTo(1); assertThat(vt.getVariableEntityCount()).isEqualTo(1); assertThat(vt.getVariableCount()).isEqualTo(2); jdbcDatasource.dispose(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-notables.sql", afterSchema = "schema-notables.sql") @Test public void testSinglelinesWriterWithMetadataTables() { JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource-nodb", dataSource, getDataSourceSettingsBuilder(false).useMetadataTables().build()); jdbcDatasource.initialise(); writeTestValueSet(jdbcDatasource); jdbcDatasource.dispose(); jdbcDatasource = new JdbcDatasource("my-datasource-nodb", dataSource, getDataSourceSettingsBuilder(false).useMetadataTables().build()); jdbcDatasource.initialise(); VariableEntity myEntity1 = new VariableEntityBean("Participant", "1"); ValueTable vt = jdbcDatasource.getValueTable("MY_TABLE"); assertThat(vt.getValueSetCount()).isEqualTo(1); assertThat(vt.hasValueSet(myEntity1)).isTrue(); ValueSet vs = vt.getValueSet(myEntity1); assertThat(vt.hasVariable("MY_VAR1")).isTrue(); Variable myVar1 = vt.getVariable("MY_VAR1"); assertThat(myVar1.isRepeatable()).isTrue(); assertThat(vt.hasVariable("MY_VAR2")).isTrue(); Variable myVar2 = vt.getVariable("MY_VAR2"); assertThat(myVar2.isRepeatable()).isTrue(); assertThat(vt.hasVariable("MY_VAR3")).isTrue(); Variable myVar3 = vt.getVariable("MY_VAR3"); assertThat(myVar3.isRepeatable()).isFalse(); Value val1 = vt.getValue(myVar1, vs); assertThat(val1.isSequence()).isTrue(); assertThat(val1.asSequence().getSize()).isEqualTo(3); assertThat(val1.asSequence().get(0).getValue()).isEqualTo(77L); assertThat(val1.asSequence().get(1).getValue()).isEqualTo(78L); assertThat(val1.asSequence().get(2).getValue()).isEqualTo(79L); Value val2 = vt.getValue(myVar2, vs); assertThat(val2.isSequence()).isTrue(); assertThat(val2.asSequence().getSize()).isEqualTo(2); assertThat(val2.asSequence().get(0).getValue()).isEqualTo(81.0); assertThat(val2.asSequence().get(1).getValue()).isEqualTo(82.0); Value val3 = vt.getValue(myVar3, vs); assertThat(val3.isSequence()).isFalse(); assertThat(val3.getValue()).isEqualTo("Coucou"); jdbcDatasource.dispose(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-notables.sql", afterSchema = "schema-notables.sql") @Test public void testSinglelinesWriterWithoutMetadataTables() { JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource-nodb", dataSource, getDataSourceSettingsBuilder(false).build()); jdbcDatasource.initialise(); writeTestValueSet(jdbcDatasource); jdbcDatasource.dispose(); JdbcValueTableSettings tableSettings = JdbcValueTableSettings.newSettings("MY_TABLE").build(); jdbcDatasource = new JdbcDatasource("my-datasource-nodb", dataSource, getDataSourceSettingsBuilder(false) .tableSettings(Sets.newHashSet(tableSettings)).build()); jdbcDatasource.initialise(); VariableEntity myEntity1 = new VariableEntityBean("Participant", "1"); ValueTable vt = jdbcDatasource.getValueTable("MY_TABLE"); assertThat(vt.getValueSetCount()).isEqualTo(1); assertThat(vt.hasValueSet(myEntity1)).isTrue(); ValueSet vs = vt.getValueSet(myEntity1); assertThat(vt.hasVariable("MY_VAR1")).isTrue(); Variable myVar1 = vt.getVariable("MY_VAR1"); assertThat(myVar1.isRepeatable()).isFalse(); assertThat(vt.hasVariable("MY_VAR2")).isTrue(); Variable myVar2 = vt.getVariable("MY_VAR2"); assertThat(myVar2.isRepeatable()).isFalse(); assertThat(vt.hasVariable("MY_VAR3")).isTrue(); Variable myVar3 = vt.getVariable("MY_VAR3"); assertThat(myVar3.isRepeatable()).isFalse(); Value val1 = vt.getValue(myVar1, vs); assertThat(val1.isSequence()).isFalse(); assertThat(val1.getValue()).isEqualTo("77,78,79"); Value val2 = vt.getValue(myVar2, vs); assertThat(val2.isSequence()).isFalse(); assertThat(val2.getValue()).isEqualTo("81,82"); Value val3 = vt.getValue(myVar3, vs); assertThat(val3.isSequence()).isFalse(); assertThat(val3.getValue()).isEqualTo("Coucou"); jdbcDatasource.dispose(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-notables.sql", afterSchema = "schema-notables.sql") @Test public void testMultilinesWriterWithMetadataTables() { // specifying useMetadataTables allows to read back the written table (otherwise table is not detected because it has no primary key) JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource-nodb", dataSource, getDataSourceSettingsBuilder(true).useMetadataTables().build()); jdbcDatasource.initialise(); writeTestValueSet(jdbcDatasource); jdbcDatasource.dispose(); jdbcDatasource = new JdbcDatasource("my-datasource-nodb", dataSource, getDataSourceSettingsBuilder(true).useMetadataTables().build()); jdbcDatasource.initialise(); VariableEntity myEntity1 = new VariableEntityBean("Participant", "1"); ValueTable vt = jdbcDatasource.getValueTable("MY_TABLE"); assertThat(vt.getValueSetCount()).isEqualTo(1); assertThat(vt.hasValueSet(myEntity1)).isTrue(); ValueSet vs = vt.getValueSet(myEntity1); assertThat(vt.hasVariable("MY_VAR1")).isTrue(); Variable myVar1 = vt.getVariable("MY_VAR1"); assertThat(myVar1.isRepeatable()).isTrue(); assertThat(vt.hasVariable("MY_VAR2")).isTrue(); Variable myVar2 = vt.getVariable("MY_VAR2"); assertThat(myVar2.isRepeatable()).isTrue(); assertThat(vt.hasVariable("MY_VAR3")).isTrue(); Variable myVar3 = vt.getVariable("MY_VAR3"); assertThat(myVar3.isRepeatable()).isFalse(); Value val1 = vt.getValue(myVar1, vs); assertThat(val1.isSequence()).isTrue(); assertThat(val1.asSequence().getSize()).isEqualTo(3); assertThat(val1.asSequence().get(0).getValue()).isEqualTo(77L); assertThat(val1.asSequence().get(1).getValue()).isEqualTo(78L); assertThat(val1.asSequence().get(2).getValue()).isEqualTo(79L); Value val2 = vt.getValue(myVar2, vs); assertThat(val2.isSequence()).isTrue(); assertThat(val2.asSequence().getSize()).isEqualTo(3); assertThat(val2.asSequence().get(0).getValue()).isEqualTo(81.0); assertThat(val2.asSequence().get(1).getValue()).isEqualTo(82.0); assertThat(val2.asSequence().get(2).isNull()).isTrue(); Value val3 = vt.getValue(myVar3, vs); assertThat(val3.isSequence()).isFalse(); assertThat(val3.getValue()).isEqualTo("Coucou"); jdbcDatasource.dispose(); } @TestSchema(schemaLocation = "org/obiba/magma/datasource/jdbc", beforeSchema = "schema-notables.sql", afterSchema = "schema-notables.sql") @Test public void testMultilinesWriterWithoutMetadataTables() { JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource-nodb", dataSource, getDataSourceSettingsBuilder(true).build()); jdbcDatasource.initialise(); writeTestValueSet(jdbcDatasource); jdbcDatasource.dispose(); JdbcValueTableSettings tableSettings = JdbcValueTableSettings.newSettings("MY_TABLE").build(); jdbcDatasource = new JdbcDatasource("my-datasource-nodb", dataSource, getDataSourceSettingsBuilder(false) .tableSettings(Sets.newHashSet(tableSettings)).build()); jdbcDatasource.initialise(); VariableEntity myEntity1 = new VariableEntityBean("Participant", "1"); ValueTable vt = jdbcDatasource.getValueTable("MY_TABLE"); assertThat(vt.getValueSetCount()).isEqualTo(1); assertThat(vt.hasValueSet(myEntity1)).isTrue(); ValueSet vs = vt.getValueSet(myEntity1); assertThat(vt.hasVariable("MY_VAR1")).isTrue(); Variable myVar1 = vt.getVariable("MY_VAR1"); assertThat(myVar1.isRepeatable()).isTrue(); assertThat(vt.hasVariable("MY_VAR2")).isTrue(); Variable myVar2 = vt.getVariable("MY_VAR2"); assertThat(myVar2.isRepeatable()).isTrue(); assertThat(vt.hasVariable("MY_VAR3")).isTrue(); Variable myVar3 = vt.getVariable("MY_VAR3"); assertThat(myVar3.isRepeatable()).isTrue(); Value val1 = vt.getValue(myVar1, vs); assertThat(val1.isSequence()).isTrue(); assertThat(val1.asSequence().getSize()).isEqualTo(3); assertThat(val1.asSequence().get(0).getValue()).isEqualTo(77L); assertThat(val1.asSequence().get(1).getValue()).isEqualTo(78L); assertThat(val1.asSequence().get(2).getValue()).isEqualTo(79L); Value val2 = vt.getValue(myVar2, vs); assertThat(val2.isSequence()).isTrue(); assertThat(val2.asSequence().getSize()).isEqualTo(3); assertThat(val2.asSequence().get(0).getValue()).isEqualTo(81.0); assertThat(val2.asSequence().get(1).getValue()).isEqualTo(82.0); assertThat(val2.asSequence().get(2).isNull()).isTrue(); Value val3 = vt.getValue(myVar3, vs); assertThat(val3.isSequence()).isTrue(); assertThat(val3.asSequence().getSize()).isEqualTo(3); assertThat(val3.asSequence().get(0).getValue()).isEqualTo("Coucou"); assertThat(val3.asSequence().get(1).getValue()).isEqualTo("Coucou"); assertThat(val3.asSequence().get(2).getValue()).isEqualTo("Coucou"); jdbcDatasource.dispose(); } // // Methods // private void testCreateDatasourceFromExistingDatabaseWithTableSettings() { JdbcValueTableSettings tableSettings = JdbcValueTableSettings.newSettings("BONE_DENSITY").entityType("Participant") .entityIdentifierColumn("PART_ID").build(); JdbcDatasource jdbcDatasource = new JdbcDatasource("my-datasource", dataSource, JdbcDatasourceSettings.newSettings("Participant").mappedTables(Sets.newHashSet("BONE_DENSITY")).tableSettings(Sets.newHashSet(tableSettings)).build()); jdbcDatasource.initialise(); createDatasourceFromExistingDatabase(jdbcDatasource); jdbcDatasource.dispose(); } private void writeTestValueSet(JdbcDatasource jdbcDatasource) { VariableEntity myEntity1 = new VariableEntityBean("Participant", "1"); try(ValueTableWriter tableWriter = jdbcDatasource.createWriter("MY_TABLE", "Participant")) { // Write some variables. try(VariableWriter variableWriter = tableWriter.writeVariables()) { variableWriter.writeVariable(Variable.Builder.newVariable("MY_VAR1", IntegerType.get(), "Participant").repeatable().build()); variableWriter.writeVariable(Variable.Builder.newVariable("MY_VAR2", DecimalType.get(), "Participant").repeatable().build()); variableWriter.writeVariable(Variable.Builder.newVariable("MY_VAR3", TextType.get(), "Participant").build()); } // Write a value set. try(ValueSetWriter valueSetWriter = tableWriter.writeValueSet(myEntity1)) { Variable myVar1 = jdbcDatasource.getValueTable("MY_TABLE").getVariable("MY_VAR1"); Variable myVar2 = jdbcDatasource.getValueTable("MY_TABLE").getVariable("MY_VAR2"); Variable myVar3 = jdbcDatasource.getValueTable("MY_TABLE").getVariable("MY_VAR3"); valueSetWriter.writeValue(myVar1, IntegerType.get().sequenceOf(Ints.asList(77, 78, 79).stream().map(v -> IntegerType.get().valueOf(v)).collect(Collectors.toList()))); valueSetWriter.writeValue(myVar2, IntegerType.get().sequenceOf(Ints.asList(81, 82).stream().map(v -> IntegerType.get().valueOf(v)).collect(Collectors.toList()))); valueSetWriter.writeValue(myVar3, TextType.get().valueOf("Coucou")); } } } private JdbcDatasourceSettings getDataSourceSettings() { return getDataSourceSettingsBuilder(false).multipleDatasources().build(); } private JdbcDatasourceSettings.Builder getDataSourceSettingsBuilder(boolean multilines) { return JdbcDatasourceSettings.newSettings("Participant") .createdTimestampColumn("created").updatedTimestampColumn("updated").multilines(multilines); } private void createDatasourceFromExistingDatabase(JdbcDatasource jdbcDatasource) { assertThat(jdbcDatasource).isNotNull(); assertThat(jdbcDatasource.getName()).isEqualTo("my-datasource"); assertThat(jdbcDatasource.getValueTables()).hasSize(1); assertThat(jdbcDatasource.hasValueTable("BONE_DENSITY")).isTrue(); ValueTable bdTable = jdbcDatasource.getValueTable("BONE_DENSITY"); assertThat(bdTable.getEntityType()).isEqualTo("Participant"); assertThat(bdTable.getVariables()).hasSize(3); assertThat(bdTable.getValueSets()).hasSize(2); assertThat(bdTable.getValueSetCount()).isEqualTo(2); VariableEntity entity1234_2 = new VariableEntityBean(bdTable.getEntityType(), "12342"); VariableEntity entity1234_3 = new VariableEntityBean(bdTable.getEntityType(), "12343"); assertThat(bdTable.hasValueSet(entity1234_2)).isTrue(); assertThat(bdTable.hasValueSet(entity1234_3)).isTrue(); // Check variable values. ValueSet vs1234_2 = bdTable.getValueSet(entity1234_2); ValueSet vs1234_3 = bdTable.getValueSet(entity1234_3); Variable bdVar = bdTable.getVariable("BD"); if (bdVar.isRepeatable()) { Value value = bdTable.getValue(bdVar, vs1234_2); assertThat(value.isSequence()).isTrue(); assertThat(value.asSequence().getSize()).isEqualTo(2); value = bdTable.getValue(bdVar, vs1234_3); assertThat(value.isSequence()).isTrue(); assertThat(value.asSequence().getSize()).isEqualTo(3); } else { assertThat(bdTable.getValue(bdVar, vs1234_2)).isEqualTo(IntegerType.get().valueOf(64)); assertThat(bdTable.getValue(bdVar, vs1234_3)).isEqualTo(IntegerType.get().valueOf(65)); } Variable bd2Var = bdTable.getVariable("BD_2"); if (bd2Var.isRepeatable()) { Value value = bdTable.getValue(bd2Var, vs1234_2); assertThat(value.isSequence()).isTrue(); assertThat(value.asSequence().getSize()).isEqualTo(2); value = bdTable.getValue(bd2Var, vs1234_3); assertThat(value.isSequence()).isTrue(); assertThat(value.asSequence().getSize()).isEqualTo(3); } else { assertThat(bdTable.getValue(bd2Var, vs1234_2)).isEqualTo(IntegerType.get().valueOf(65)); assertThat(bdTable.getValue(bd2Var, vs1234_3)).isEqualTo(IntegerType.get().valueOf(65)); } } private void createDatasourceFromScratch(JdbcDatasource jdbcDatasource) { // Create a new ValueTable. try(ValueTableWriter tableWriter = jdbcDatasource.createWriter("MY_TABLE", "Participant")) { assertThat(tableWriter).isNotNull(); assertThat(jdbcDatasource.getName()).isEqualTo("my-datasource-nodb"); assertThat(jdbcDatasource.hasValueTable("MY_TABLE")).isTrue(); // Write some variables. try(VariableWriter variableWriter = tableWriter.writeVariables()) { variableWriter.writeVariable(Variable.Builder.newVariable("MY_VAR1", IntegerType.get(), "Participant").build()); variableWriter.writeVariable(Variable.Builder.newVariable("MY_VAR2", DecimalType.get(), "Participant").build()); } // Write a value set. VariableEntity myEntity1 = new VariableEntityBean("Participant", "1"); try(ValueSetWriter valueSetWriter = tableWriter.writeValueSet(myEntity1)) { Variable myVar1 = jdbcDatasource.getValueTable("MY_TABLE").getVariable("MY_VAR1"); Variable myVar2 = jdbcDatasource.getValueTable("MY_TABLE").getVariable("MY_VAR2"); valueSetWriter.writeValue(myVar1, IntegerType.get().valueOf(77)); valueSetWriter.writeValue(myVar2, IntegerType.get().valueOf(78)); } } } private boolean hasCategory(Variable variable, String categoryName) { if(variable.hasCategories()) { for(Category category : variable.getCategories()) { if(category.getName().equals(categoryName)) { return true; } } } return false; } }