Skip to content
Snippets Groups Projects
Commit 58bd6fc8 authored by Nikolaus Krismer's avatar Nikolaus Krismer
Browse files

added dataset filter mechanisms (that checks for configured tables in

the DB)
parent f16727be
No related branches found
No related tags found
No related merge requests found
......@@ -22,6 +22,7 @@ import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
......@@ -74,7 +75,7 @@ public class ConfigDataset {
}
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigDataset.class);
private static final Collection<String> ALL_DATASETS = initDatasets();
private static final Collection<String> ALL_DATASETS = getAvailableDatasets(true);
private static final String DS_CONFIG_PATTERN = ".*config\\_(.*)\\.xml";
private static Map<String, ConfigDataset> instanceMap = new HashMap<>();
......@@ -174,14 +175,12 @@ public class ConfigDataset {
protected TableEntry vertexTableEntry;
public static ConfigDataset getInstance(final String datasetName) {
final List<String> propertyFiles = new ArrayList<>(1);
propertyFiles.add("config_" + datasetName);
if (!ALL_DATASETS.contains(datasetName)) {
return null;
}
if (!instanceMap.containsKey(datasetName)) {
final ConfigDataset config = new ConfigBuilder<>(ConfigDataset.class).overridePropertiesFiles(propertyFiles).build();
config.datasetName = datasetName;
config.initTableEntries();
final ConfigDataset config = createInstance(datasetName);
instanceMap.put(datasetName, config);
return config;
}
......@@ -369,8 +368,57 @@ public class ConfigDataset {
return clientArrivalTime;
}
// Protected static methods
protected static Collection<String> getAvailableDatasets(final boolean filterInvalid) {
final Pattern dsConfigPattern = Pattern.compile(DS_CONFIG_PATTERN);
Collection<String> fileCollection = null;
try {
fileCollection = ResourceHelper.getResources(dsConfigPattern);
} catch (IOException e) {
fileCollection = null;
LOGGER.warn("Datasets could not be read. There might be no configured datasets available!");
}
if (fileCollection == null) {
return Collections.emptyList();
}
final List<String> datasets = new ArrayList<>(fileCollection.size());
for (String fileName : fileCollection) {
final Matcher m = dsConfigPattern.matcher(fileName);
if (m.matches()) {
datasets.add(m.group(1));
}
}
Collections.sort(datasets);
if (filterInvalid) {
return filterInvalidDatasets(datasets);
}
return datasets;
}
// Private methods
private boolean hasValidDatabase(final Collection<String> allTables) {
Collection<String> configTables = new ArrayList<>();
configTables.add(getTableDatecodes());
configTables.add(getTableEdges());
// configTables.add(getTableIsoAreaBuffer());
// configTables.add(getTableIsoLinks());
// configTables.add(getTableIsoNodes());
// configTables.add(getTableIsoNodesAnnotations());
configTables.add(getTableRoutes());
configTables.add(getTableSchedule());
configTables.add(getTableVertex());
configTables.add(getTableVertexDensity());
return allTables.containsAll(configTables);
};
private void initTableEntries() {
edgeTableEntry = createTableEntry(getTableIsoLinks(), getIndexIsoLinks(), TableType.EDGE);
areaBufferTableEntry = createTableEntry(getTableIsoAreaBuffer(), getIndexIsoAreaBuffer(), TableType.COVERAGE);
......@@ -380,6 +428,15 @@ public class ConfigDataset {
// Private static methods
private static ConfigDataset createInstance(final String datasetName) {
final List<String> baseNames = Arrays.asList(new String[]{"config_" + datasetName});
final ConfigDataset config = new ConfigBuilder<>(ConfigDataset.class).overridePropertiesFiles(baseNames).build();
config.datasetName = datasetName;
config.initTableEntries();
return config;
}
private static TableEntry createTableEntry(final String tblName) {
return createTableEntry(tblName, null, null);
}
......@@ -395,32 +452,21 @@ public class ConfigDataset {
return new TableEntry(tblName.trim(), idxName.trim(), type);
}
private static Collection<String> initDatasets() {
final Pattern dsConfigPattern = Pattern.compile(DS_CONFIG_PATTERN);
Collection<String> fileCollection = null;
try {
fileCollection = ResourceHelper.getResources(dsConfigPattern);
} catch (IOException e) {
fileCollection = null;
LOGGER.warn("Datasets could not be read. There might be no configured datasets available!");
}
if (fileCollection == null) {
return Collections.emptyList();
}
final List<String> dsConfigCollection = new ArrayList<>(fileCollection.size());
for (String fileName : fileCollection) {
final Matcher m = dsConfigPattern.matcher(fileName);
if (m.matches()) {
dsConfigCollection.add(m.group(1));
private static Collection<String> filterInvalidDatasets(final Collection<String> datasets) {
final Collection<String> filteredList = new ArrayList<String>(datasets.size());
final ConfigIsochrone config = ConfigIsochrone.getInstance();
final Collection<String> allTables = config.getAllTables();
for (final String ds : datasets) {
final ConfigDataset c = ConfigDataset.createInstance(ds);
if (c.hasValidDatabase(allTables)) {
LOGGER.info("Dataset configuration \"" + ds + "\" will be available to clients");
filteredList.add(ds);
} else {
LOGGER.warn("Not using dataset configuration \"" + ds + "\" since configured tables are not available!");
}
}
// TODO: Remove datasets, which are not configured correctly or have no data (or datatables) int
Collections.sort(dsConfigCollection);
return dsConfigCollection;
return filteredList;
}
}
......@@ -11,10 +11,14 @@ import com.tngtech.configbuilder.annotation.valueextractor.PropertyValue;
import it.unibz.inf.isochrone.db.ConnectionFactory;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import javax.validation.constraints.NotNull;
import org.apache.commons.dbutils.DbUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -174,4 +178,23 @@ public final class ConfigIsochrone {
}
}
public Collection<String> getAllTables() {
final Collection<String> result = new ArrayList<>();
final String query = "SELECT tablename FROM pg_tables WHERE schemaname='public'";
ResultSet rs = null;
try {
rs = getConnection().prepareCall(query).executeQuery();
while (rs.next()) {
result.add(rs.getString("tablename"));
}
} catch (SQLException e) {
LOGGER.warn("Could not get tables from database");
} finally {
DbUtils.closeQuietly(rs);
}
return result;
}
}
......@@ -8,20 +8,35 @@ import org.testng.annotations.Test;
public class ConfigDatasetTest {
private static final int EXPECTED_NUM_DATASETS = 4;
private static final int EXPECTED_NUM_DATASETS_FILTERED = 1;
private static final String[] EXPECTED_DATASETS = new String[] {"bz", "it", "sf", "st"};
private static final String[] EXPECTED_DATASETS_FILTERED = new String[] {"bz"};
@Test
public void testDatasetCount() throws URISyntaxException {
final Collection<String> datasetCollection = ConfigDataset.getAllDatasets();
final Collection<String> datasetCollection = ConfigDataset.getAvailableDatasets(false);
Assert.assertEquals(datasetCollection.size(), EXPECTED_NUM_DATASETS, "Unexpected number of configured datasets");
}
@Test
public void testDatasetNames() throws URISyntaxException {
final Collection<String> datasetCollection = ConfigDataset.getAllDatasets();
final Collection<String> datasetCollection = ConfigDataset.getAvailableDatasets(false);
for (String dsName : EXPECTED_DATASETS) {
Assert.assertTrue(datasetCollection.contains(dsName), "Dataset of " + dsName + " unconfigured");
}
}
@Test
public void testDatasetCountFiltered() throws URISyntaxException {
final Collection<String> datasetCollection = ConfigDataset.getAvailableDatasets(true);
Assert.assertEquals(datasetCollection.size(), EXPECTED_NUM_DATASETS_FILTERED, "Unexpected number of configured datasets");
}
@Test
public void testDatasetNamesFiltered() throws URISyntaxException {
final Collection<String> datasetCollection = ConfigDataset.getAvailableDatasets(true);
for (String dsName : EXPECTED_DATASETS_FILTERED) {
Assert.assertTrue(datasetCollection.contains(dsName), "Dataset of " + dsName + " unconfigured");
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment