diff --git a/NEWS.md b/NEWS.md index 4b4fa0b0..edefe5d3 100644 --- a/NEWS.md +++ b/NEWS.md @@ -10,12 +10,14 @@ Announcements: - Improved efficiency of query samples while instatiating a map (#1120). - Cache control header fine tuning. Set a shorter value for "max-age" directive if there is no way to know when to trigger the invalidation. - Update deps: - - Update `cartodb-query-tables` to version [`0.5.0`](https://github.com/CartoDB/node-cartodb-query-tables/releases/tag/0.5.0) - - Upgrade `windshaft` to [`5.6.0`](https://github.com/CartoDB/Windshaft/blob/5.6.0/NEWS.md#version-560): + - Update `cartodb-query-tables` to version [`0.6.1`](https://github.com/CartoDB/node-cartodb-query-tables/blob/8dda0e1fb7292840c4ac381f9be2eb3976d180a1/NEWS.md#version-061). + - Update `cartodb-psql` to [`0.14.0`](https://github.com/CartoDB/node-cartodb-psql/blob/0.14.0/NEWS.md#version-0140-2019-09-10) + - Upgrade `windshaft` to [`5.6.3`](https://github.com/CartoDB/Windshaft/blob/master/NEWS.md#version-563): - Upgrade grainstore to [`2.0.1`](https://github.com/CartoDB/grainstore/releases/tag/2.0.1) - Update @carto/mapnik to [`3.6.2-carto.16`](https://github.com/CartoDB/node-mapnik/blob/v3.6.2-carto.16/CHANGELOG.carto.md#362-carto16). - Update turbo-carto to [`0.21.2`](https://github.com/CartoDB/turbo-carto/releases/tag/0.21.2) - Upgrade `@carto/cartonik` to version [`0.7.0`](https://github.com/CartoDB/cartonik/blob/v0.7.0/CHANGELOG.md#cartonik-changelog). + - Upgrade `camshaft` to [`0.64.2`](https://github.com/CartoDB/camshaft/blob/8b89fcff276da20a71269bed28b7ad6704392898/CHANGELOG.md#0642) to update dependencies. ## 7.1.0 Released 2019-05-06 diff --git a/lib/cartodb/backends/cluster.js b/lib/cartodb/backends/cluster.js index 24145b8d..27d8d5ac 100644 --- a/lib/cartodb/backends/cluster.js +++ b/lib/cartodb/backends/cluster.js @@ -5,8 +5,8 @@ const dbParamsFromReqParams = require('../utils/database-params'); const debug = require('debug')('backend:cluster'); const AggregationMapConfig = require('../models/aggregation/aggregation-mapconfig'); -const windshaftUtils = require('windshaft').utils; -const webmercator = new windshaftUtils.WebMercatorHelper(); +const WebMercatorHelper = require('cartodb-query-tables').utils.webMercatorHelper; +const webmercator = new WebMercatorHelper(); module.exports = class ClusterBackend { getClusterFeatures (mapConfigProvider, params, callback) { diff --git a/lib/cartodb/backends/layer-stats/mapnik-layer-stats.js b/lib/cartodb/backends/layer-stats/mapnik-layer-stats.js index 3d229799..8e281e19 100644 --- a/lib/cartodb/backends/layer-stats/mapnik-layer-stats.js +++ b/lib/cartodb/backends/layer-stats/mapnik-layer-stats.js @@ -36,7 +36,7 @@ function _getSQL(ctx, query, type='pre', zoom=0) { else { sql = ctx.aggrQuery; } - sql = queryUtils.subsituteTokensForZoom(sql, zoom || 0); + sql = queryUtils.substituteTokensForZoom(sql, zoom || 0); return query(sql); } diff --git a/lib/cartodb/models/aggregation/aggregation-query.js b/lib/cartodb/models/aggregation/aggregation-query.js index dbcbc616..4e76fc75 100644 --- a/lib/cartodb/models/aggregation/aggregation-query.js +++ b/lib/cartodb/models/aggregation/aggregation-query.js @@ -3,8 +3,8 @@ const timeDimension = require('./time-dimension'); const DEFAULT_PLACEMENT = 'point-sample'; -const windshaftUtils = require('windshaft').utils; -const webmercator = new windshaftUtils.WebMercatorHelper(); +const WebMercatorHelper = require('cartodb-query-tables').utils.webMercatorHelper; +const webmercator = new WebMercatorHelper(); function optionsToParams (options) { return { diff --git a/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js b/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js index 31c4f7c4..e54632d6 100644 --- a/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js @@ -6,7 +6,7 @@ var queue = require('queue-async'); var PSQL = require('cartodb-psql'); var turboCarto = require('turbo-carto'); -var SubstitutionTokens = require('../../../utils/substitution-tokens'); +const SubstitutionTokens = require('cartodb-query-tables').utils.substitutionTokens; var PostgresDatasource = require('../../../backends/turbo-carto-postgres-datasource'); var MapConfig = require('windshaft').model.MapConfig; diff --git a/lib/cartodb/models/mapconfig/provider/base-mapconfig-adapter.js b/lib/cartodb/models/mapconfig/provider/base-mapconfig-adapter.js index de156217..301ea3b5 100644 --- a/lib/cartodb/models/mapconfig/provider/base-mapconfig-adapter.js +++ b/lib/cartodb/models/mapconfig/provider/base-mapconfig-adapter.js @@ -1,6 +1,6 @@ 'use strict'; -const QueryTables = require('cartodb-query-tables'); +const QueryTables = require('cartodb-query-tables').queryTables; module.exports = class BaseMapConfigProvider { createAffectedTables (callback) { @@ -34,7 +34,7 @@ module.exports = class BaseMapConfigProvider { return callback(err); } - QueryTables.getAffectedTablesFromQuery(connection, sql, (err, affectedTables) => { + QueryTables.getQueryMetadataModel(connection, sql, (err, affectedTables) => { if (err) { return callback(err); } diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index ad998ef9..a200b062 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -79,22 +79,22 @@ function getAndValidateVersions(options) { windshaft_cartodb: packageDefinition.version }; - var dependenciesToValidate = ['camshaft', 'turbo-carto', 'windshaft']; - dependenciesToValidate.forEach(function(depName) { - var declaredDependencyVersion = declaredDependencies[depName]; - var installedDependencyVersion = installedDependenciesVersions[depName]; - if (!semver.satisfies(installedDependencyVersion,declaredDependencyVersion)) { - warn( - 'Dependency="%s" installed version="%s" does not match declared version="%s". Check your installation.', - depName, installedDependencyVersion, declaredDependencyVersion - ); - } - }); + if (process.env.NODE_ENV !== 'test') { + var dependenciesToValidate = ['camshaft', 'turbo-carto', 'windshaft']; + dependenciesToValidate.forEach(function(depName) { + var declaredDependencyVersion = declaredDependencies[depName]; + var installedDependencyVersion = installedDependenciesVersions[depName]; + if (!semver.satisfies(installedDependencyVersion,declaredDependencyVersion)) { + warn(`Dependency="${depName}" installed version="${installedDependencyVersion}" does ` + + `not match declared version="${declaredDependencyVersion}". Check your installation.`); + } + }); - // Be nice and warn if configured mapnik version is != installed mapnik version - if (windshaft.mapnik.versions.mapnik !== options.grainstore.mapnik_version) { - warn('WARNING: detected mapnik version (' + windshaft.mapnik.versions.mapnik + ')' + - ' != configured mapnik version (' + options.grainstore.mapnik_version + ')'); + // Be nice and warn if configured mapnik version is != installed mapnik version + if (windshaft.mapnik.versions.mapnik !== options.grainstore.mapnik_version) { + warn('WARNING: detected mapnik version (' + windshaft.mapnik.versions.mapnik + ')' + + ' != configured mapnik version (' + options.grainstore.mapnik_version + ')'); + } } return installedDependenciesVersions; diff --git a/lib/cartodb/utils/query-utils.js b/lib/cartodb/utils/query-utils.js index 8ef03c34..bc7c0307 100644 --- a/lib/cartodb/utils/query-utils.js +++ b/lib/cartodb/utils/query-utils.js @@ -1,14 +1,7 @@ 'use strict'; -const windshaftUtils = require('windshaft').utils; - -module.exports.extractTableNames = function (query) { - return [ - 'SELECT * FROM CDB_QueryTablesText($windshaft$', - substituteDummyTokens(query), - '$windshaft$) as tablenames' - ].join(''); -}; +const SubstitutionTokens = require('cartodb-query-tables').utils.substitutionTokens; +const WebMercatorHelper = require('cartodb-query-tables').utils.webMercatorHelper; module.exports.getQueryActualRowCount = function (query) { return `select COUNT(*) AS rows FROM (${substituteDummyTokens(query)}) AS __cdb_query`; @@ -132,35 +125,16 @@ function queryPromise(dbConnection, query) { } function substituteDummyTokens(sql) { - return subsituteTokensForZoom(sql, 0); + return SubstitutionTokens.replace(sql); } -function subsituteTokensForZoom(sql, zoom) { - if (!sql) { - return undefined; - } - const affectedTableRegexCache = { - bbox: /!bbox!/g, - scale_denominator: /!scale_denominator!/g, - pixel_width: /!pixel_width!/g, - pixel_height: /!pixel_height!/g - }; - - const webmercator = new windshaftUtils.WebMercatorHelper(); - const resolution = webmercator.getResolution({ z : zoom }); - const scaleDenominator = resolution.dividedBy(0.00028); - // We always use the whole world as the bbox - const extent = webmercator.getExtent({ x : 0, y : 0, z : 0 }); - - return sql - .replace(affectedTableRegexCache.bbox, - `ST_MakeEnvelope(${extent.xmin}, ${extent.ymin}, ${extent.xmax}, ${extent.ymax}, 3857)`) - .replace(affectedTableRegexCache.scale_denominator, scaleDenominator) - .replace(affectedTableRegexCache.pixel_width, resolution) - .replace(affectedTableRegexCache.pixel_height, resolution); +function substituteTokensForZoom(sql, zoom) { + const extent = new WebMercatorHelper().getExtent({ x : 0, y : 0, z : 0 }); + const bbox = `ST_MakeEnvelope(${extent.xmin}, ${extent.ymin}, ${extent.xmax}, ${extent.ymax}, 3857)`; + return SubstitutionTokens.replaceXYZ(sql, { z : zoom, bbox: bbox }); } module.exports.queryPromise = queryPromise; module.exports.getQueryLimited = getQueryLimited; module.exports.substituteDummyTokens = substituteDummyTokens; -module.exports.subsituteTokensForZoom = subsituteTokensForZoom; +module.exports.substituteTokensForZoom = substituteTokensForZoom; diff --git a/package-lock.json b/package-lock.json index b8f8c7f0..ab6444fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -277,14 +277,6 @@ "moment": "^2.10.6", "mv": "~2", "safe-json-stringify": "~1" - }, - "dependencies": { - "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", - "optional": true - } } }, "bytes": { @@ -298,18 +290,27 @@ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, "camshaft": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/camshaft/-/camshaft-0.64.0.tgz", - "integrity": "sha512-5FPNdrkNlgfqq+1X2KWfc1MlZ/si8sqPmjogUZSLY/RnJIp+XlS80HDIsF3FYKSvmps9GO8k2Qi73fRll0EyGg==", + "version": "0.64.2", + "resolved": "https://registry.npmjs.org/camshaft/-/camshaft-0.64.2.tgz", + "integrity": "sha512-BWXD8zoKmVaHZHAVFUVM/VrlXNQ+lcJFQSDSFcljRS4Yj4yuyEOs22DyULEI0dq3Xnkhwx14gUlhuFd/PgFxbA==", "requires": { "async": "^1.5.2", "bunyan": "1.8.1", - "cartodb-psql": "0.13.1", + "cartodb-psql": "0.14.0", + "cartodb-query-tables": "^0.6.1", "debug": "^3.1.0", "dot": "^1.0.3", "request": "2.85.0" }, "dependencies": { + "cartodb-query-tables": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/cartodb-query-tables/-/cartodb-query-tables-0.6.1.tgz", + "integrity": "sha512-hQR9F5tQ6W6uGZk8Us/0fwkAsvYfbsHUzyKqBqDYue+jOa7FrGS+KpWokdLYHhR/ye3N3iR9RBTrIkwp6aoUww==", + "requires": { + "decimal.js": "10.2.0" + } + }, "request": { "version": "2.85.0", "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", @@ -342,11 +343,11 @@ } }, "canvas": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.5.0.tgz", - "integrity": "sha512-wwRz2cLMgb9d+rnotOJCoc04Bzj3aJMpWc6JxAD6lP7bYz0ldcn0sKddoZ0vhD5T8HBxrK+XmRDJb68/2VqARw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.0.tgz", + "integrity": "sha512-bEO9f1ThmbknLPxCa8Es7obPlN9W3stB1bo7njlhOFKIdUTldeTqXCh9YclCPAi2pSQs84XA0jq/QEZXSzgyMw==", "requires": { - "nan": "^2.13.2", + "nan": "^2.14.0", "node-pre-gyp": "^0.11.0", "simple-get": "^3.0.3" }, @@ -382,9 +383,9 @@ } }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" } @@ -416,9 +417,9 @@ } }, "cartodb-psql": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/cartodb-psql/-/cartodb-psql-0.13.1.tgz", - "integrity": "sha512-1z3Dk9G8KQlNGurbcmGBvNj8DVCh1Keue9uzyyvB6hKOYzBHMxixAMG0D+8nSsA7oQmWUsx/xkZZ5ZxT9toEHA==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/cartodb-psql/-/cartodb-psql-0.14.0.tgz", + "integrity": "sha512-myLV2xo3q9oTT8m8M+c+UTD/ziDN7hrYtZ9yY00KvMnu2NsVeRQsTe8Yxq1GVS8vF9iYfcelwjVEGObPUdLtHw==", "requires": { "debug": "^3.1.0", "pg": "github:cartodb/node-postgres#6.4.2-cdb2", @@ -426,9 +427,12 @@ } }, "cartodb-query-tables": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cartodb-query-tables/-/cartodb-query-tables-0.5.0.tgz", - "integrity": "sha512-xVHWKF6DMSn/Ksqhm6uNNnr8ckWDWWzsTz9XsoELAW5ZpCJDaxn3YGxgRtD1bwHdQd1tjDVeud/pRk/mCFWpmQ==" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/cartodb-query-tables/-/cartodb-query-tables-0.6.1.tgz", + "integrity": "sha512-hQR9F5tQ6W6uGZk8Us/0fwkAsvYfbsHUzyKqBqDYue+jOa7FrGS+KpWokdLYHhR/ye3N3iR9RBTrIkwp6aoUww==", + "requires": { + "decimal.js": "10.2.0" + } }, "cartodb-redis": { "version": "2.1.0", @@ -1568,12 +1572,12 @@ } }, "gdal": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/gdal/-/gdal-0.9.8.tgz", - "integrity": "sha512-qSG8/W8qyJbKkmc1/B9mJwRZPbKEGkqlipsAfVMch/R2Qi9Wl1bpkLv7cAHd1urUA1d3MowpovHmSwQq4ZyvUw==", + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/gdal/-/gdal-0.9.9.tgz", + "integrity": "sha512-YlFal25vTaN/tdLg8Irz0pxP+sTY69F0IIdD3fnkjcNaOnM04CoT2aMYUurdDByIVXnAWRHaFYcsxVQMVWptxg==", "requires": { "nan": "~2.10.0", - "node-pre-gyp": "^0.11.0" + "node-pre-gyp": "^0.13.0" }, "dependencies": { "abbrev": { @@ -1601,7 +1605,7 @@ "bundled": true }, "brace-expansion": { - "version": "1.1.8", + "version": "1.1.11", "bundled": true, "requires": { "balanced-match": "^1.0.0", @@ -1609,7 +1613,7 @@ } }, "chownr": { - "version": "1.0.1", + "version": "1.1.2", "bundled": true }, "code-point-at": { @@ -1629,10 +1633,10 @@ "bundled": true }, "debug": { - "version": "2.6.8", + "version": "3.2.6", "bundled": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "deep-extend": { @@ -1648,7 +1652,7 @@ "bundled": true }, "fs-minipass": { - "version": "1.2.5", + "version": "1.2.6", "bundled": true, "requires": { "minipass": "^2.2.1" @@ -1673,7 +1677,7 @@ } }, "glob": { - "version": "7.1.2", + "version": "7.1.4", "bundled": true, "requires": { "fs.realpath": "^1.0.0", @@ -1689,8 +1693,11 @@ "bundled": true }, "iconv-lite": { - "version": "0.4.18", - "bundled": true + "version": "0.4.24", + "bundled": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } }, "ignore-walk": { "version": "3.0.1", @@ -1708,7 +1715,7 @@ } }, "inherits": { - "version": "2.0.3", + "version": "2.0.4", "bundled": true }, "ini": { @@ -1738,25 +1745,15 @@ "bundled": true }, "minipass": { - "version": "2.3.4", + "version": "2.3.5", "bundled": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "bundled": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true - } } }, "minizlib": { - "version": "1.1.0", + "version": "1.2.1", "bundled": true, "requires": { "minipass": "^2.2.1" @@ -1770,7 +1767,7 @@ } }, "ms": { - "version": "2.0.0", + "version": "2.1.2", "bundled": true }, "nan": { @@ -1779,22 +1776,16 @@ "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" }, "needle": { - "version": "2.2.2", + "version": "2.4.0", "bundled": true, "requires": { - "debug": "^2.1.2", + "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" - }, - "dependencies": { - "sax": { - "version": "1.2.4", - "bundled": true - } } }, "node-pre-gyp": { - "version": "0.11.0", + "version": "0.13.0", "bundled": true, "requires": { "detect-libc": "^1.0.2", @@ -1807,29 +1798,6 @@ "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "bundled": true - }, - "tar": { - "version": "4.4.6", - "bundled": true, - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.3", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.0.2", - "bundled": true - } } }, "nopt": { @@ -1841,11 +1809,11 @@ } }, "npm-bundled": { - "version": "1.0.5", + "version": "1.0.6", "bundled": true }, "npm-packlist": { - "version": "1.1.11", + "version": "1.4.4", "bundled": true, "requires": { "ignore-walk": "^3.0.1", @@ -1898,7 +1866,7 @@ "bundled": true }, "process-nextick-args": { - "version": "1.0.7", + "version": "2.0.1", "bundled": true }, "rc": { @@ -1918,31 +1886,39 @@ } }, "readable-stream": { - "version": "2.3.3", + "version": "2.3.6", "bundled": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "rimraf": { - "version": "2.6.1", + "version": "2.6.3", "bundled": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.1", + "version": "5.1.2", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true + }, + "sax": { + "version": "1.2.4", "bundled": true }, "semver": { - "version": "5.4.1", + "version": "5.7.1", "bundled": true }, "set-blocking": { @@ -1963,7 +1939,7 @@ } }, "string_decoder": { - "version": "1.0.3", + "version": "1.1.1", "bundled": true, "requires": { "safe-buffer": "~5.1.0" @@ -1980,6 +1956,19 @@ "version": "2.0.1", "bundled": true }, + "tar": { + "version": "4.4.10", + "bundled": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.5", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, "util-deprecate": { "version": "1.0.2", "bundled": true @@ -1994,6 +1983,10 @@ "wrappy": { "version": "1.0.2", "bundled": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true } } }, @@ -2040,9 +2033,9 @@ } }, "graceful-fs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", - "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" }, "grainstore": { "version": "2.0.1", @@ -2075,9 +2068,9 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -2095,9 +2088,9 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -2230,9 +2223,9 @@ "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==" }, "htmlparser2": { "version": "3.8.3", @@ -2296,9 +2289,9 @@ } }, "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.2.tgz", + "integrity": "sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw==", "requires": { "minimatch": "^3.0.4" } @@ -2717,9 +2710,9 @@ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.6.0.tgz", + "integrity": "sha512-OuNZ0OHrrI+jswzmgivYBZ+fAAGHZA4293d5q0z631/I9QSw3yumKB92njxHIHiB1eAdGRsE+3CcOPkoEyV5FQ==", "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -2738,9 +2731,9 @@ } }, "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.2.tgz", + "integrity": "sha512-hR3At21uSrsjjDTWrbu0IMLTpnkpv8IIMFDFaoz43Tmu4LkmAXfH44vNNzpTnf+OAQQCHrb91y/wc2J4x5XgSQ==", "requires": { "minipass": "^2.2.1" } @@ -2798,8 +2791,7 @@ "moment": { "version": "2.22.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", - "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==", - "dev": true + "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==" }, "ms": { "version": "2.0.0", @@ -2912,9 +2904,9 @@ } }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" } @@ -3497,9 +3489,9 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "requires": { "path-parse": "^1.0.6" } @@ -4040,22 +4032,32 @@ "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" }, "windshaft": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/windshaft/-/windshaft-5.6.0.tgz", - "integrity": "sha512-yXEdmrbOChYnL6VQBLW/uX6kfc68+dd26z3KCAG8X/VMnhhyXBqYOsttnMYO5SNqCyzuj5gu/pG06jRXwtN23g==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/windshaft/-/windshaft-5.6.3.tgz", + "integrity": "sha512-ProHyEDICqIhTkNouT9elj5FP9DCtApEFo7SvPlZbkeYygn1OGLN89Rq0/2WuGK5Y6AbX8INa5iYGxdGYaWKqQ==", "requires": { "@carto/cartonik": "^0.7.0", "@carto/mapnik": "3.6.2-carto.16", "canvas": "^2.4.1", "carto": "github:cartodb/carto#0.15.1-cdb5", - "cartodb-psql": "0.13.1", + "cartodb-psql": "^0.14.0", + "cartodb-query-tables": "^0.6.1", "debug": "3.1.0", - "decimal.js": "^10.2.0", "grainstore": "^2.0.1", "redis-mpool": "0.7.0", "request": "2.87.0", "semver": "5.5.0", "torque.js": "3.1.1" + }, + "dependencies": { + "cartodb-query-tables": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/cartodb-query-tables/-/cartodb-query-tables-0.6.1.tgz", + "integrity": "sha512-hQR9F5tQ6W6uGZk8Us/0fwkAsvYfbsHUzyKqBqDYue+jOa7FrGS+KpWokdLYHhR/ye3N3iR9RBTrIkwp6aoUww==", + "requires": { + "decimal.js": "10.2.0" + } + } } }, "wordwrap": { @@ -4240,9 +4242,9 @@ } }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" } diff --git a/package.json b/package.json index fdd3e0b6..01f38640 100644 --- a/package.json +++ b/package.json @@ -27,9 +27,9 @@ "@carto/fqdn-sync": "0.2.2", "basic-auth": "2.0.0", "body-parser": "1.18.3", - "camshaft": "^0.64.0", - "cartodb-psql": "0.13.1", - "cartodb-query-tables": "^0.5.0", + "camshaft": "^0.64.2", + "cartodb-psql": "0.14.0", + "cartodb-query-tables": "^0.6.1", "cartodb-redis": "2.1.0", "debug": "3.1.0", "dot": "1.1.2", @@ -49,7 +49,7 @@ "step-profiler": "0.3.0", "turbo-carto": "0.21.2", "underscore": "1.6.0", - "windshaft": "^5.6.0", + "windshaft": "^5.6.3", "yargs": "11.1.0" }, "devDependencies": { diff --git a/test/acceptance/aggregation.js b/test/acceptance/aggregation.js index c722a23c..7bc5e6de 100644 --- a/test/acceptance/aggregation.js +++ b/test/acceptance/aggregation.js @@ -6,8 +6,8 @@ const assert = require('../support/assert'); const TestClient = require('../support/test-client'); const serverOptions = require('../../lib/cartodb/server_options'); -const windshaftUtils = require('windshaft').utils; -const webmercator = new windshaftUtils.WebMercatorHelper(); +const WebMercatorHelper = require('cartodb-query-tables').utils.webMercatorHelper; +const webmercator = new WebMercatorHelper(); const suites = [ { diff --git a/test/acceptance/multilayer.js b/test/acceptance/multilayer.js index 1d9b2422..28d9914f 100644 --- a/test/acceptance/multilayer.js +++ b/test/acceptance/multilayer.js @@ -21,7 +21,7 @@ var IMAGE_EQUALS_HIGHER_TOLERANCE_PER_MIL = 25; var CartodbWindshaft = require('../../lib/cartodb/server'); var serverOptions = require('../../lib/cartodb/server_options'); -var QueryTables = require('cartodb-query-tables'); +var QueryTables = require('cartodb-query-tables').queryTables; ['/api/v1/map', '/user/localhost/api/v1/map'].forEach(function(layergroup_url) { @@ -282,7 +282,7 @@ describe(suiteName, function() { var parsedBody = JSON.parse(res.body); expected_token = parsedBody.layergroupid.split(':')[0]; helper.checkCache(res); - helper.checkSurrogateKey(res, new QueryTables.DatabaseTablesEntry([ + helper.checkSurrogateKey(res, new QueryTables.QueryMetadata([ {dbname: "test_windshaft_cartodb_user_1_db", table_name: "test_table", schema_name: "public"}, {dbname: "test_windshaft_cartodb_user_1_db", table_name: "test_table_2", schema_name: "public"}, ]).key().join(' ')); diff --git a/test/acceptance/multilayer_server.js b/test/acceptance/multilayer_server.js index f13c8f0a..3f6c1b45 100644 --- a/test/acceptance/multilayer_server.js +++ b/test/acceptance/multilayer_server.js @@ -9,7 +9,7 @@ var _ = require('underscore'); var LayergroupToken = require('../../lib/cartodb/models/layergroup-token'); var PgQueryRunner = require('../../lib/cartodb/backends/pg_query_runner'); -var QueryTables = require('cartodb-query-tables'); +var QueryTables = require('cartodb-query-tables').queryTables; var CartodbWindshaft = require('../../lib/cartodb/server'); var serverOptions = require('../../lib/cartodb/server_options'); @@ -367,11 +367,9 @@ describe('tests from old api translated to multilayer', function() { keysToDelete['map_cfg|' + LayergroupToken.parse(JSON.parse(res.body).layergroupid).token] = 0; keysToDelete['user:localhost:mapviews:global'] = 5; - var affectedFn = QueryTables.getAffectedTablesFromQuery; - QueryTables.getAffectedTablesFromQuery = function(sql, username, query, callback) { - affectedFn({query: function(query, callback) { - return callback(new Error('fake error message'), []); - }}, username, query, callback); + var affectedFn = QueryTables.getQueryMetadataModel; + QueryTables.getQueryMetadataModel = function(pg, sql, callback) { + return callback(new Error('fake error message')); }; // reset internal cacheChannel cache @@ -396,8 +394,8 @@ describe('tests from old api translated to multilayer', function() { status: 200 }, function(res) { + QueryTables.getQueryMetadataModel = affectedFn; assert.ok(!res.headers.hasOwnProperty('x-cache-channel')); - QueryTables.getAffectedTablesFromQuery = affectedFn; done(); } ); diff --git a/test/acceptance/templates.js b/test/acceptance/templates.js index e8038347..72e6fa73 100644 --- a/test/acceptance/templates.js +++ b/test/acceptance/templates.js @@ -5,7 +5,7 @@ var _ = require('underscore'); var redis = require('redis'); var step = require('step'); var strftime = require('strftime'); -var QueryTables = require('cartodb-query-tables'); +var QueryTables = require('cartodb-query-tables').queryTables; var NamedMapsCacheEntry = require('../../lib/cartodb/cache/model/named_maps_entry'); var redis_stats_db = 5; @@ -1416,7 +1416,7 @@ describe('template_api', function() { // See https://github.com/CartoDB/Windshaft-cartodb/issues/176 helper.checkCache(res); var expectedSurrogateKey = [ - new QueryTables.DatabaseTablesEntry([{dbname: 'test_windshaft_cartodb_user_1_db', schema_name: 'public', + new QueryTables.QueryMetadata([{dbname: 'test_windshaft_cartodb_user_1_db', schema_name: 'public', table_name: 'test_table_private_1'}]).key(), new NamedMapsCacheEntry('localhost', template_acceptance_open.name).key() ].join(' '); @@ -1500,7 +1500,7 @@ describe('template_api', function() { // See https://github.com/CartoDB/Windshaft-cartodb/issues/176 helper.checkCache(res); var expectedSurrogateKey = [ - new QueryTables.DatabaseTablesEntry([{dbname: 'test_windshaft_cartodb_user_1_db', schema_name: 'public', + new QueryTables.QueryMetadata([{dbname: 'test_windshaft_cartodb_user_1_db', schema_name: 'public', table_name: 'test_table_private_1'}]).key(), new NamedMapsCacheEntry('localhost', template_acceptance_open.name).key() ].join(' '); diff --git a/test/integration/query-tables.js b/test/integration/query-tables.js index 6ce50ce7..721de841 100644 --- a/test/integration/query-tables.js +++ b/test/integration/query-tables.js @@ -9,7 +9,7 @@ var cartodbRedis = require('cartodb-redis'); var PgConnection = require('../../lib/cartodb/backends/pg_connection'); -var QueryTables = require('cartodb-query-tables'); +var QueryTables = require('cartodb-query-tables').queryTables; describe('QueryTables', function() { @@ -34,18 +34,15 @@ describe('QueryTables', function() { it('should return an object with affected tables array and last updated time', function(done) { var query = 'select * from test_table'; - QueryTables.getAffectedTablesFromQuery(connection, query, function(err, result) { + QueryTables.getQueryMetadataModel(connection, query, function(err, result) { assert.ok(!err, err); assert.equal(result.getLastUpdatedAt(), 1234567890123); assert.equal(result.tables.length, 1); - assert.deepEqual(result.tables[0], { - dbname: 'test_windshaft_cartodb_user_1_db', - schema_name: 'public', - table_name: 'test_table', - updated_at: new Date(1234567890123) - }); + assert.equal(result.tables[0].dbname, 'test_windshaft_cartodb_user_1_db'); + assert.equal(result.tables[0].schema_name, 'public'); + assert.equal(result.tables[0].table_name, 'test_table'); done(); }); @@ -53,18 +50,15 @@ describe('QueryTables', function() { it('should work with private tables', function(done) { var query = 'select * from test_table_private_1'; - QueryTables.getAffectedTablesFromQuery(connection, query, function(err, result) { + QueryTables.getQueryMetadataModel(connection, query, function(err, result) { assert.ok(!err, err); assert.equal(result.getLastUpdatedAt(), 1234567890123); assert.equal(result.tables.length, 1); - assert.deepEqual(result.tables[0], { - dbname: 'test_windshaft_cartodb_user_1_db', - schema_name: 'public', - table_name: 'test_table_private_1', - updated_at: new Date(1234567890123) - }); + assert.equal(result.tables[0].dbname, 'test_windshaft_cartodb_user_1_db'); + assert.equal(result.tables[0].schema_name, 'public'); + assert.equal(result.tables[0].table_name, 'test_table_private_1'); done(); });