diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d8c64ad6c013dd16027ede9594faffdbda0c499..97af9675b3d647fc4a7ffe28db9887a85bf35504 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ Upcoming version: ----------------- + - reworked ConfigDataset; switched from BoneCP to HikariCP (Nikolaus Krismer) - updating gradle to version 3.1 (Nikolaus Krismer) - updating log4j and config-builder versions; changing from boneCP to hikariCP (Nikolaus Krismer) - implemented maxSpeed regarding on edges when calculating isochrones (gives a real difference to isodistances) (Nikolaus Krismer) diff --git a/doc/config.ad b/doc/config.ad index 12f4e3856ea4c73f3b8236a11dfbdc44629d6555..d3b8e6ff8baf1b49f623e52f9e25bdfff938dbe1 100644 --- a/doc/config.ad +++ b/doc/config.ad @@ -105,13 +105,13 @@ The following configuration illustrates the configuration of a dataset named "my <entry key="tbl.nodes.tiles">myName_nodes_tiles</entry> <!-- Database result tables --> - <entry key="idx.isoCoverage">sidx_myName_iso_coverage</entry> - <entry key="idx.isoEdges">sidx_myName_iso_edges</entry> - <entry key="idx.isoNodes">sidx_myName_iso_nodes</entry> - <entry key="tbl.isoCoverage">myName_iso_coverage</entry> - <entry key="tbl.isoEdges">myName_iso_edges</entry> - <entry key="tbl.isoNodes">myName_iso_nodes</entry> - <entry key="tbl.isoNodesAnnotations">myName_iso_nann</entry> + <entry key="idx.coverageClient">sidx_myName_coverage_client</entry> + <entry key="idx.edgesClient">sidx_myName_edges_client</entry> + <entry key="idx.nodesClient">sidx_myName_nodes_client</entry> + <entry key="tbl.coverageClient">myName_coverage_client</entry> + <entry key="tbl.edgesClient">myName_edges_client</entry> + <entry key="tbl.nodesClient">myName_nodes_client</entry> + <entry key="tbl.nodesAnnotationsClient">myName_nann_client</entry> <!-- Algorithm default settings --> <entry key="algorithm.MineR.nodeLimit"></entry> diff --git a/src/main/java/it/unibz/inf/isochrone/algorithm/AbstractAlgorithm.java b/src/main/java/it/unibz/inf/isochrone/algorithm/AbstractAlgorithm.java index 9267deb73b44b00d18983bbb6b00b1b619d08610..fa330e181e01350966d21e6874d8b1019c2c3381 100644 --- a/src/main/java/it/unibz/inf/isochrone/algorithm/AbstractAlgorithm.java +++ b/src/main/java/it/unibz/inf/isochrone/algorithm/AbstractAlgorithm.java @@ -109,7 +109,7 @@ public abstract class AbstractAlgorithm { this.cQueryPoints = config.getQueryPoints(); this.cQueryPointsSRID = config.getQueryPointSRID(); this.cToTime = config.getTimeTo(); - this.cWalkingSpeed = config.getWalkingSpeed().floatValue() / CONVERSION_FACTOR_TO_METER_PER_SEC; + this.cWalkingSpeed = (config.getWalkingSpeed() == null) ? 1.0f : config.getWalkingSpeed().floatValue() / CONVERSION_FACTOR_TO_METER_PER_SEC; if (cIsMultimodal && config.getDateTime() == null) { throw new AlgorithmException("Invalid algorithm configuration given!"); diff --git a/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java b/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java index 4419bea34dd92d6972e530dec5a55e953ace4a4f..cdf5bfc9ad8e95ecdbe5c71bd39ccb574930b151 100644 --- a/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java +++ b/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java @@ -36,8 +36,6 @@ import org.apache.commons.jcs.access.CacheAccess; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import it.unibz.inf.isochrone.db.DbTable; -import it.unibz.inf.isochrone.db.DbTableType; import it.unibz.inf.isochrone.db.DbType; import it.unibz.inf.isochrone.db.DbUtils; @@ -112,20 +110,20 @@ public class ConfigDataset { @PropertyValue("client.displayName") private String displayName; // null or empty string falls back to dataset name - @DefaultValue("sidx_%datasetName%_iso_coverage") + @DefaultValue("sidx_%datasetName%_coverage_client") @NotNull - @PropertyValue("idx.isoCoverage") - private String indexIsoCoverage; + @PropertyValue("idx.coverageClient") + private String indexCoverageClient; - @DefaultValue("sidx_%datasetName%_iso_edges") + @DefaultValue("sidx_%datasetName%_edges_client") @NotNull - @PropertyValue("idx.isoEdges") - private String indexIsoEdges; + @PropertyValue("idx.edgesClient") + private String indexEdgesClient; - @DefaultValue("sidx_%datasetName%_iso_nodes") + @DefaultValue("sidx_%datasetName%_nodes_client") @NotNull - @PropertyValue("idx.isoNodes") - private String indexIsoNodes; + @PropertyValue("idx.nodesClient") + private String indexNodesClient; @PropertyValue("license.name") private String licenseName; @@ -150,30 +148,30 @@ public class ConfigDataset { @PropertyValue("tbl.calendar") private String tableCalendar; + @DefaultValue("%datasetName%_coverage_client") + @NotNull + @PropertyValue("tbl.coverageClient") + private String tableCoverageClient; + @DefaultValue("%datasetName%_edges") @NotNull @PropertyValue("tbl.edges") private String tableEdges; - @DefaultValue("%datasetName%_iso_coverage") - @NotNull - @PropertyValue("tbl.isoCoverage") - private String tableIsoCoverage; - - @DefaultValue("%datasetName%_iso_edges") + @DefaultValue("%datasetName%_edges_client") @NotNull - @PropertyValue("tbl.isoEdges") - private String tableIsoEdges; + @PropertyValue("tbl.edgesClient") + private String tableEdgesClient; - @DefaultValue("%datasetName%_iso_nodes") + @DefaultValue("%datasetName%_nodes_client") @NotNull - @PropertyValue("tbl.isoNodes") - private String tableIsoNodes; + @PropertyValue("tbl.nodesClient") + private String tableNodesClient; - @DefaultValue("%datasetName%_iso_nann") + @DefaultValue("%datasetName%_nann_client") @NotNull - @PropertyValue("tbl.isoNodesAnnotations") - private String tableIsoNodesAnnotations; + @PropertyValue("tbl.nodesAnnotations_client") + private String tableNodesAnnotationsClient; @DefaultValue("%datasetName%_routes") @NotNull @@ -208,10 +206,6 @@ public class ConfigDataset { private boolean multimodal; private int serverSRID = -1; private boolean valid; - protected DbTable coverageTable; - protected DbTable edgesTable; - protected DbTable nodesAnnotatedTable; - protected DbTable nodesTable; static { CACHE_INSTANCE = JCS.getInstance(CACHE_IDENTIFIER); @@ -293,32 +287,28 @@ public class ConfigDataset { algorithmRangeLimit = o.algorithmRangeLimit; calendarValidity = o.calendarValidity; clientArrivalDateTime = o.clientArrivalDateTime; - coverageTable = o.coverageTable; datasetName = o.datasetName; displayName = o.displayName; - edgesTable = o.edgesTable; geoType = o.geoType; hasDensity = o.hasDensity; hasTileInformation = o.hasTileInformation; - indexIsoCoverage = o.indexIsoCoverage; - indexIsoEdges = o.indexIsoEdges; - indexIsoNodes = o.indexIsoNodes; + indexCoverageClient = o.indexCoverageClient; + indexEdgesClient = o.indexEdgesClient; + indexNodesClient = o.indexNodesClient; multimodal = o.multimodal; synthetic = o.synthetic; valid = o.valid; licenseName = o.licenseName; licenseUrl = o.licenseUrl; - nodesAnnotatedTable = o.nodesAnnotatedTable; - nodesTable = o.nodesTable; queryPoint = o.queryPoint; queryPointName = o.queryPointName; serverSRID = o.serverSRID; tableCalendar = o.tableCalendar; tableEdges = o.tableEdges; - tableIsoCoverage = o.tableIsoCoverage; - tableIsoEdges = o.tableIsoEdges; - tableIsoNodes = o.tableIsoNodes; - tableIsoNodesAnnotations = o.tableIsoNodesAnnotations; + tableCoverageClient = o.tableCoverageClient; + tableEdgesClient = o.tableEdgesClient; + tableNodesClient = o.tableNodesClient; + tableNodesAnnotationsClient = o.tableNodesAnnotationsClient; tableNodes = o.tableNodes; tableNodesDensity = o.tableNodesDensity; tableNodesTileInformation = o.tableNodesTileInformation; @@ -372,47 +362,31 @@ public class ConfigDataset { return serverSRID; } - public DbTable getTableCoverage() { - return coverageTable; - } - - public DbTable getTableEdges() { - return edgesTable; - } - - public DbTable getTableNodesAnnotated() { - return nodesAnnotatedTable; - } - - public DbTable getTableNodes() { - return nodesTable; - } - - public String getTablenameCalendar() { + public String getTableCalendar() { return tableCalendar; } - public String getTablenameEdges() { + public String getTableEdges() { return tableEdges; } - public String getTablenameNodes() { + public String getTableNodes() { return tableNodes; } - public String getTablenameNodesDensity() { + public String getTableNodesDensity() { return tableNodesDensity; } - public String getTablenameNodesTileInformation() { + public String getTableNodesTileInformation() { return tableNodesTileInformation; } - public String getTablenameRoutes() { + public String getTableRoutes() { return tableRoutes; } - public String getTablenameSchedule() { + public String getTableSchedule() { return tableSchedules; } @@ -451,6 +425,36 @@ public class ConfigDataset { return "ConfigDataset [datasetName=" + datasetName + ", serverSRID=" + serverSRID + "]"; } + // Protected methods + + protected String getIndexCoverageClient() { + return indexCoverageClient; + } + + protected String getIndexEdgesClient() { + return indexEdgesClient; + } + + protected String getIndexNodesClient() { + return indexNodesClient; + } + + protected String getTableCoverageClient() { + return tableCoverageClient; + } + + protected String getTableEdgesClient() { + return tableEdgesClient; + } + + protected String getTableNodesClient() { + return tableNodesClient; + } + + protected String getTableNodesAnnotationsClient() { + return tableNodesAnnotationsClient; + } + // Protected static methods protected static ConfigDataset createInstance(final String datasetName) { @@ -466,7 +470,6 @@ public class ConfigDataset { } config.replaceDefaultPlaceholders(); - config.initTableEntries(); config.initState(); config.initGeoType(); config.initServerSRID(); @@ -502,34 +505,6 @@ public class ConfigDataset { clientArrivalDateTime = ldt; } - private String getIndexnameIsoCoverage() { - return indexIsoCoverage; - } - - private String getIndexnameIsoEdges() { - return indexIsoEdges; - } - - private String getIndexnameIsoNodes() { - return indexIsoNodes; - } - - private String getTablenameIsoCoverage() { - return tableIsoCoverage; - } - - private String getTablenameIsoEdges() { - return tableIsoEdges; - } - - private String getTablenameIsoNodes() { - return tableIsoNodes; - } - - private String getTablenameIsoNodesAnnotations() { - return tableIsoNodesAnnotations; - } - private void initCalendarValidity() { if (!multimodal) { return; @@ -539,7 +514,7 @@ public class ConfigDataset { final ConfigIsochrone config = ConfigIsochrone.getInstance(); try (final Connection conn = config.getConnection()) { - calendarValidity = DbUtils.getCalendarValidity(conn, getTablenameCalendar()); + calendarValidity = DbUtils.getCalendarValidity(conn, getTableCalendar()); } catch (final SQLException e) { LOGGER.warn(" could not get calendar validity from database"); calendarValidity = null; @@ -588,16 +563,16 @@ public class ConfigDataset { return; } - final boolean containsDensity = ALL_DB_TABLENAMES.contains(getTablenameNodesDensity()); - final boolean containsTileInformation = ALL_DB_TABLENAMES.contains(getTablenameNodesTileInformation()); + final boolean containsDensity = ALL_DB_TABLENAMES.contains(getTableNodesDensity()); + final boolean containsTileInformation = ALL_DB_TABLENAMES.contains(getTableNodesTileInformation()); final Collection<String> unimodalTables = Arrays.asList(new String[] { - getTablenameEdges(), - getTablenameNodes() + getTableEdges(), + getTableNodes() }); final Collection<String> multimodalTables = Arrays.asList(new String[] { - getTablenameCalendar(), - getTablenameRoutes(), - getTablenameSchedule() + getTableCalendar(), + getTableRoutes(), + getTableSchedule() }); multimodal = ALL_DB_TABLENAMES.containsAll(multimodalTables); @@ -610,13 +585,6 @@ public class ConfigDataset { } } - private void initTableEntries() { - coverageTable = new DbTable(getTablenameIsoCoverage(), getIndexnameIsoCoverage(), DbTableType.COVERAGE, true); - edgesTable = new DbTable(getTablenameIsoEdges(), getIndexnameIsoEdges(), DbTableType.EDGE, true); - nodesAnnotatedTable = new DbTable(getTablenameIsoNodesAnnotations(), null, null, false); - nodesTable = new DbTable(getTablenameIsoNodes(), getIndexnameIsoNodes(), DbTableType.NODE, true); - } - private boolean isValidCalendar(final long epochDay) { if (calendarValidity == null) { return false; diff --git a/src/main/java/it/unibz/inf/isochrone/config/ConnectionFactory.java b/src/main/java/it/unibz/inf/isochrone/config/ConnectionFactory.java index ffc0c34f1ec565374e40d2a0117c0f03483103ed..fe475951b73eb29425320303b5ad8b9f0ba6f8c9 100644 --- a/src/main/java/it/unibz/inf/isochrone/config/ConnectionFactory.java +++ b/src/main/java/it/unibz/inf/isochrone/config/ConnectionFactory.java @@ -1,7 +1,7 @@ package it.unibz.inf.isochrone.config; -import com.jolbox.bonecp.BoneCP; -import com.jolbox.bonecp.BoneCPConfig; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.pool.HikariPool; import java.sql.Connection; import java.sql.DriverManager; @@ -24,11 +24,10 @@ import it.unibz.inf.isochrone.db.DbType; */ class ConnectionFactory { private static final Logger LOGGER = LogManager.getLogger(ConnectionFactory.class); - private static final int MIN_CONNECTIONS = 5; private static final String PATTERN_SQLITE = "(\\w|/|\\.)+\\|(\\w|/|\\.)+"; private final ConfigIsochrone config; private Connection connection; - private BoneCP connectionPool; + private HikariPool connectionPool; private String jdbcUrl; private String spatialLiteLibrary; private Properties sqliteProperties; @@ -77,22 +76,19 @@ class ConnectionFactory { if (config.isPooling()) { final int maxConnections = config.getMaxConnections(); - final BoneCPConfig poolConfig = new BoneCPConfig(); -// poolConfig.setCloseConnectionWatch(true); // activate this only for debugging purposes! - poolConfig.setDefaultAutoCommit(false); + final HikariConfig poolConfig = new HikariConfig(); + poolConfig.setAutoCommit(false); poolConfig.setJdbcUrl(jdbcUrl); - poolConfig.setMinConnectionsPerPartition(Math.min(MIN_CONNECTIONS, maxConnections)); - poolConfig.setMaxConnectionsPerPartition(maxConnections); - poolConfig.setPartitionCount(1); + poolConfig.setMaximumPoolSize(maxConnections); if (sqliteProperties != null) { - poolConfig.setDriverProperties(sqliteProperties); + poolConfig.setDataSourceProperties(sqliteProperties); } else { - poolConfig.setUser(config.getDBUser()); + poolConfig.setUsername(config.getDBUser()); poolConfig.setPassword(config.getDBPassword()); } - connectionPool = new BoneCP(poolConfig); + connectionPool = new HikariPool(poolConfig); } // CHECKSTYLE:OFF MagicNumber diff --git a/src/main/java/it/unibz/inf/isochrone/db/Database.java b/src/main/java/it/unibz/inf/isochrone/db/Database.java index c715c2afe4c6348cdd87883b726d5b79ac270498..0136cf0dd15d26d50c83320f2625cc438a017fe6 100644 --- a/src/main/java/it/unibz/inf/isochrone/db/Database.java +++ b/src/main/java/it/unibz/inf/isochrone/db/Database.java @@ -504,7 +504,7 @@ public class Database implements AutoCloseable { public List<Location> projectOnStreetEdges(final Point2D qNode, final int clientSRID) { final IDbQuery dbQuery = query.getProjectToLocation(); final List<Location> locations = new ArrayList<>(); - final String queryStr = String.format(dbQuery.getSql(), config.getTablenameEdges(), String.valueOf(Edge.Mode.STREET.getModeId())); + final String queryStr = String.format(dbQuery.getSql(), config.getTableEdges(), String.valueOf(Edge.Mode.STREET.getModeId())); PreparedStatement statement = null; ResultSet rSet = null; diff --git a/src/main/java/it/unibz/inf/isochrone/db/DbQueryPostgres.java b/src/main/java/it/unibz/inf/isochrone/db/DbQueryPostgres.java index 7c823a2420779dbbc53393074602a46246083c71..324e093180a85d2f83f2fcd62a6f9c280a766d36 100644 --- a/src/main/java/it/unibz/inf/isochrone/db/DbQueryPostgres.java +++ b/src/main/java/it/unibz/inf/isochrone/db/DbQueryPostgres.java @@ -14,12 +14,12 @@ class DbQueryPostgres extends AbstractDbQuery { // Private static methods private static DbQueryBuilder getDbQueryBuilder(final ConfigDataset config, final boolean isIncoming, final boolean fetchGeometries) { - final String configEdges = config.getTablenameEdges(); - final String configCalendar = config.getTablenameCalendar(); - final String configSchedule = config.getTablenameSchedule(); - final String configNode = config.getTablenameNodes(); - final String configNodeDensity = config.getTablenameNodesDensity(); - final String configNodeTileInformation = config.getTablenameNodesTileInformation(); + final String configEdges = config.getTableEdges(); + final String configCalendar = config.getTableCalendar(); + final String configSchedule = config.getTableSchedule(); + final String configNode = config.getTableNodes(); + final String configNodeDensity = config.getTableNodesDensity(); + final String configNodeTileInformation = config.getTableNodesTileInformation(); final boolean usesGeographyType = (config.getGeoType().equalsIgnoreCase("geography")); final int serverSRID = config.getServerSRID(); diff --git a/src/main/java/it/unibz/inf/isochrone/db/DbQuerySqlite.java b/src/main/java/it/unibz/inf/isochrone/db/DbQuerySqlite.java index 7f56d2e26148e148d3bf1083d1311a85437d4e26..6dc5e77302435e16e871c4bfb25f761334a37a56 100644 --- a/src/main/java/it/unibz/inf/isochrone/db/DbQuerySqlite.java +++ b/src/main/java/it/unibz/inf/isochrone/db/DbQuerySqlite.java @@ -15,12 +15,12 @@ class DbQuerySqlite extends AbstractDbQuery { // Private static methods private static DbQueryBuilder getDbQueryBuilder(final ConfigDataset config, final boolean isIncoming, final boolean fetchGeometries) { - final String configEdges = config.getTablenameEdges(); - final String configCalendar = config.getTablenameCalendar(); - final String configSchedule = config.getTablenameSchedule(); - final String configNode = config.getTablenameNodes(); - final String configNodeDensity = config.getTablenameNodesDensity(); - final String configNodeTileInformation = config.getTablenameNodesTileInformation(); + final String configEdges = config.getTableEdges(); + final String configCalendar = config.getTableCalendar(); + final String configSchedule = config.getTableSchedule(); + final String configNode = config.getTableNodes(); + final String configNodeDensity = config.getTableNodesDensity(); + final String configNodeTileInformation = config.getTableNodesTileInformation(); final int serverSRID = config.getServerSRID(); final String allEdges = "SELECT id, source, target, source_outdegree outdegree, target_indegree indegree, kmh AS maxSpeed, length, mode, route_id, route_agency_id" diff --git a/src/main/java/it/unibz/inf/isochrone/db/DbTable.java b/src/main/java/it/unibz/inf/isochrone/db/DbTable.java index 0f8dff4f7e9ad7b4b24ffaceff7da9ddbd41d92e..e349d653cfeb69f8301e7de26e3d442582de9f95 100644 --- a/src/main/java/it/unibz/inf/isochrone/db/DbTable.java +++ b/src/main/java/it/unibz/inf/isochrone/db/DbTable.java @@ -13,13 +13,17 @@ public final class DbTable { // Constructors - public DbTable(final String tableName, final String indexName, final DbTableType type, final boolean hasGeomColumn) { + public DbTable(final String tableName, final String geoIndexName, final DbTableType type) { this.tableName = tableName.trim().toLowerCase(Locale.ENGLISH); - this.hasGeomColumn = hasGeomColumn; - this.indexName = (indexName == null) ? null : indexName.trim(); + this.hasGeomColumn = (geoIndexName != null); + this.indexName = (geoIndexName == null) ? null : geoIndexName.trim(); this.type = (type == null) ? null : type; } + public DbTable(final String tableName) { + this(tableName, null, null); + } + // Getter public String getIndexName() { diff --git a/src/test/java/it/unibz/inf/isochrone/TestGeoHelper.java b/src/test/java/it/unibz/inf/isochrone/TestGeoHelper.java index 81fb46bf6bc193b2453fca77019456f7baf11c46..9b7ea3dc66ebef29f0b8c31d8ef725a9c51a1da3 100644 --- a/src/test/java/it/unibz/inf/isochrone/TestGeoHelper.java +++ b/src/test/java/it/unibz/inf/isochrone/TestGeoHelper.java @@ -86,7 +86,7 @@ public final class TestGeoHelper { */ @SuppressFBWarnings("SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING") public static Integer findNearestNodeId(final ConfigDataset ds, final Point2D p, final Edge.Mode mode) { - String tableName = ds.getTablenameNodes(); + String tableName = ds.getTableNodes(); if (mode != null) { tableName += " WHERE mode=" + mode.getModeId(); } @@ -120,7 +120,7 @@ public final class TestGeoHelper { @SuppressFBWarnings("SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING") public static Collection<Integer> getDensities(final ConfigDataset ds) { - final String tableName = ds.getTablenameNodesDensity(); + final String tableName = ds.getTableNodesDensity(); final String query = String.format(ALL_DENSITIES, tableName); final ConfigIsochrone config = ConfigIsochrone.getInstance();