UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

159 lines (155 loc) 19.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.TableToolComponent = TableToolComponent; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _reactRedux = require("react-redux"); var _react = _interopRequireWildcard(require("react")); var _duckdb = require("@openassistant/duckdb"); var _actions = require("@kepler.gl/actions"); var _processors = require("@kepler.gl/processors"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project // This component will create a new table using the SQL query which will // 1. add a new column // 2. delete a column // 3. rename a column // 4. change the variable type of a column function TableToolComponent(_ref) { var sql = _ref.sql, dbTableName = _ref.dbTableName, newDatasetName = _ref.queryDatasetName; var datasets = (0, _reactRedux.useSelector)(function (state) { return state.demo.keplerGl.map.visState.datasets; }); var queryInProgress = (0, _react.useRef)(null); var dispatch = (0, _reactRedux.useDispatch)(); var _useState = (0, _react.useState)(null), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), error = _useState2[0], setError = _useState2[1]; (0, _react.useEffect)(function () { // check if the newDatasetName is already in the datasets var newDatasetId = Object.keys(datasets).find(function (dataId) { return datasets[dataId].label === newDatasetName; }); // if the newDatasetName is already in the datasets, return if (newDatasetId) return; var addTable = /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() { return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: if (!queryInProgress.current) { _context2.next = 3; break; } _context2.next = 3; return queryInProgress.current; case 3: // Create a new promise for this query queryInProgress.current = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { var duckDB, conn, arrowResult, jsonResult, processedData; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.prev = 0; _context.next = 3; return (0, _duckdb.getDuckDB)(); case 3: duckDB = _context.sent; if (duckDB) { _context.next = 6; break; } throw new Error('DuckDB instance is not initialized'); case 6: if (!(dbTableName && sql)) { _context.next = 22; break; } _context.next = 9; return duckDB.connect(); case 9: conn = _context.sent; _context.next = 12; return conn.query(sql); case 12: arrowResult = _context.sent; // convert arrowResult to a JSON object jsonResult = arrowResult.toArray().map(function (row) { return (0, _duckdb.convertArrowRowToObject)(row); }); // use processFileData to process the rowObject _context.next = 16; return (0, _processors.processFileData)({ content: { fileName: newDatasetName, data: jsonResult }, fileCache: [] }); case 16: processedData = _context.sent; // add the new dataset to the map dispatch((0, _actions.addDataToMap)({ datasets: processedData, options: { autoCreateLayers: true, centerMap: true } })); // delete the table from the database _context.next = 20; return conn.query("DROP TABLE ".concat(dbTableName)); case 20: _context.next = 22; return conn.close(); case 22: _context.next = 28; break; case 24: _context.prev = 24; _context.t0 = _context["catch"](0); console.error(_context.t0); setError(_context.t0 instanceof Error ? _context.t0.message : 'Unknown error occurred'); case 28: _context.prev = 28; queryInProgress.current = null; return _context.finish(28); case 31: case "end": return _context.stop(); } }, _callee, null, [[0, 24, 28, 31]]); }))(); // Wait for the query to complete _context2.next = 6; return queryInProgress.current; case 6: case "end": return _context2.stop(); } }, _callee2); })); return function addTable() { return _ref2.apply(this, arguments); }; }(); addTable(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return error ? /*#__PURE__*/_react["default"].createElement("div", { style: { color: 'red', fontSize: '8px' } }, error) : null; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3RSZWR1eCIsInJlcXVpcmUiLCJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9kdWNrZGIiLCJfYWN0aW9ucyIsIl9wcm9jZXNzb3JzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiVGFibGVUb29sQ29tcG9uZW50IiwiX3JlZiIsInNxbCIsImRiVGFibGVOYW1lIiwibmV3RGF0YXNldE5hbWUiLCJxdWVyeURhdGFzZXROYW1lIiwiZGF0YXNldHMiLCJ1c2VTZWxlY3RvciIsInN0YXRlIiwiZGVtbyIsImtlcGxlckdsIiwibWFwIiwidmlzU3RhdGUiLCJxdWVyeUluUHJvZ3Jlc3MiLCJ1c2VSZWYiLCJkaXNwYXRjaCIsInVzZURpc3BhdGNoIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkyIiwiZXJyb3IiLCJzZXRFcnJvciIsInVzZUVmZmVjdCIsIm5ld0RhdGFzZXRJZCIsImtleXMiLCJmaW5kIiwiZGF0YUlkIiwibGFiZWwiLCJhZGRUYWJsZSIsIl9yZWYyIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUyIiwid3JhcCIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsInByZXYiLCJuZXh0IiwiY3VycmVudCIsIl9jYWxsZWUiLCJkdWNrREIiLCJjb25uIiwiYXJyb3dSZXN1bHQiLCJqc29uUmVzdWx0IiwicHJvY2Vzc2VkRGF0YSIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJnZXREdWNrREIiLCJzZW50IiwiRXJyb3IiLCJjb25uZWN0IiwicXVlcnkiLCJ0b0FycmF5Iiwicm93IiwiY29udmVydEFycm93Um93VG9PYmplY3QiLCJwcm9jZXNzRmlsZURhdGEiLCJjb250ZW50IiwiZmlsZU5hbWUiLCJkYXRhIiwiZmlsZUNhY2hlIiwiYWRkRGF0YVRvTWFwIiwib3B0aW9ucyIsImF1dG9DcmVhdGVMYXllcnMiLCJjZW50ZXJNYXAiLCJjb25jYXQiLCJjbG9zZSIsInQwIiwiY29uc29sZSIsIm1lc3NhZ2UiLCJmaW5pc2giLCJzdG9wIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJjcmVhdGVFbGVtZW50Iiwic3R5bGUiLCJjb2xvciIsImZvbnRTaXplIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xzL2tlcGxlci10b29scy90YWJsZS10b29sLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge3VzZVNlbGVjdG9yfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgUmVhY3QsIHt1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlRGlzcGF0Y2h9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7Z2V0RHVja0RCLCBMb2NhbFF1ZXJ5QWRkaXRpb25hbERhdGEsIGNvbnZlcnRBcnJvd1Jvd1RvT2JqZWN0fSBmcm9tICdAb3BlbmFzc2lzdGFudC9kdWNrZGInO1xuXG5pbXBvcnQge1N0YXRlfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2FpLWFzc2lzdGFudC1tYW5hZ2VyJztcbmltcG9ydCB7YWRkRGF0YVRvTWFwfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtwcm9jZXNzRmlsZURhdGF9IGZyb20gJ0BrZXBsZXIuZ2wvcHJvY2Vzc29ycyc7XG5cbi8vIFRoaXMgY29tcG9uZW50IHdpbGwgY3JlYXRlIGEgbmV3IHRhYmxlIHVzaW5nIHRoZSBTUUwgcXVlcnkgd2hpY2ggd2lsbFxuLy8gMS4gYWRkIGEgbmV3IGNvbHVtblxuLy8gMi4gZGVsZXRlIGEgY29sdW1uXG4vLyAzLiByZW5hbWUgYSBjb2x1bW5cbi8vIDQuIGNoYW5nZSB0aGUgdmFyaWFibGUgdHlwZSBvZiBhIGNvbHVtblxuZXhwb3J0IGZ1bmN0aW9uIFRhYmxlVG9vbENvbXBvbmVudCh7XG4gIHNxbCxcbiAgZGJUYWJsZU5hbWUsXG4gIHF1ZXJ5RGF0YXNldE5hbWU6IG5ld0RhdGFzZXROYW1lXG59OiBMb2NhbFF1ZXJ5QWRkaXRpb25hbERhdGEpIHtcbiAgY29uc3QgZGF0YXNldHMgPSB1c2VTZWxlY3Rvcigoc3RhdGU6IFN0YXRlKSA9PiBzdGF0ZS5kZW1vLmtlcGxlckdsLm1hcC52aXNTdGF0ZS5kYXRhc2V0cyk7XG4gIGNvbnN0IHF1ZXJ5SW5Qcm9ncmVzcyA9IHVzZVJlZjxQcm9taXNlPHZvaWQ+IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcblxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gY2hlY2sgaWYgdGhlIG5ld0RhdGFzZXROYW1lIGlzIGFscmVhZHkgaW4gdGhlIGRhdGFzZXRzXG4gICAgY29uc3QgbmV3RGF0YXNldElkID0gT2JqZWN0LmtleXMoZGF0YXNldHMpLmZpbmQoXG4gICAgICBkYXRhSWQgPT4gZGF0YXNldHNbZGF0YUlkXS5sYWJlbCA9PT0gbmV3RGF0YXNldE5hbWVcbiAgICApO1xuICAgIC8vIGlmIHRoZSBuZXdEYXRhc2V0TmFtZSBpcyBhbHJlYWR5IGluIHRoZSBkYXRhc2V0cywgcmV0dXJuXG4gICAgaWYgKG5ld0RhdGFzZXRJZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgYWRkVGFibGUgPSBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBJZiBhIHF1ZXJ5IGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlXG4gICAgICBpZiAocXVlcnlJblByb2dyZXNzLmN1cnJlbnQpIHtcbiAgICAgICAgYXdhaXQgcXVlcnlJblByb2dyZXNzLmN1cnJlbnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBwcm9taXNlIGZvciB0aGlzIHF1ZXJ5XG4gICAgICBxdWVyeUluUHJvZ3Jlc3MuY3VycmVudCA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZHVja0RCID0gYXdhaXQgZ2V0RHVja0RCKCk7XG4gICAgICAgICAgaWYgKCFkdWNrREIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRHVja0RCIGluc3RhbmNlIGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGJUYWJsZU5hbWUgJiYgc3FsKSB7XG4gICAgICAgICAgICAvLyBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZVxuICAgICAgICAgICAgY29uc3QgY29ubiA9IGF3YWl0IGR1Y2tEQi5jb25uZWN0KCk7XG5cbiAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIHByb3ZpZGVkIFNRTCBxdWVyeVxuICAgICAgICAgICAgY29uc3QgYXJyb3dSZXN1bHQgPSBhd2FpdCBjb25uLnF1ZXJ5KHNxbCk7XG5cbiAgICAgICAgICAgIC8vIGNvbnZlcnQgYXJyb3dSZXN1bHQgdG8gYSBKU09OIG9iamVjdFxuICAgICAgICAgICAgY29uc3QganNvblJlc3VsdCA9IGFycm93UmVzdWx0LnRvQXJyYXkoKS5tYXAocm93ID0+IGNvbnZlcnRBcnJvd1Jvd1RvT2JqZWN0KHJvdykpO1xuXG4gICAgICAgICAgICAvLyB1c2UgcHJvY2Vzc0ZpbGVEYXRhIHRvIHByb2Nlc3MgdGhlIHJvd09iamVjdFxuICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IGF3YWl0IHByb2Nlc3NGaWxlRGF0YSh7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IHtmaWxlTmFtZTogbmV3RGF0YXNldE5hbWUsIGRhdGE6IGpzb25SZXN1bHR9LFxuICAgICAgICAgICAgICBmaWxlQ2FjaGU6IFtdXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gYWRkIHRoZSBuZXcgZGF0YXNldCB0byB0aGUgbWFwXG4gICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgYWRkRGF0YVRvTWFwKHtcbiAgICAgICAgICAgICAgICBkYXRhc2V0czogcHJvY2Vzc2VkRGF0YSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB7YXV0b0NyZWF0ZUxheWVyczogdHJ1ZSwgY2VudGVyTWFwOiB0cnVlfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSB0YWJsZSBmcm9tIHRoZSBkYXRhYmFzZVxuICAgICAgICAgICAgYXdhaXQgY29ubi5xdWVyeShgRFJPUCBUQUJMRSAke2RiVGFibGVOYW1lfWApO1xuXG4gICAgICAgICAgICAvLyBjbG9zZSB0aGUgY29ubmVjdGlvblxuICAgICAgICAgICAgYXdhaXQgY29ubi5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICBzZXRFcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yIG9jY3VycmVkJyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcXVlcnlJblByb2dyZXNzLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICAvLyBXYWl0IGZvciB0aGUgcXVlcnkgdG8gY29tcGxldGVcbiAgICAgIGF3YWl0IHF1ZXJ5SW5Qcm9ncmVzcy5jdXJyZW50O1xuICAgIH07XG5cbiAgICBhZGRUYWJsZSgpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW10pO1xuXG4gIHJldHVybiBlcnJvciA/IDxkaXYgc3R5bGU9e3tjb2xvcjogJ3JlZCcsIGZvbnRTaXplOiAnOHB4J319PntlcnJvcn08L2Rpdj4gOiBudWxsO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUdBLElBQUFBLFdBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUdBLElBQUFJLFFBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFdBQUEsR0FBQUwsT0FBQTtBQUFzRCxTQUFBTSx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQUwsd0JBQUFLLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFBLE9BQUFRLENBQUEsS0FBQUMsU0FBQSxVQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FBQSxJQUFBRCxNQUFBLENBQUFFLHdCQUFBLFdBQUFDLENBQUEsSUFBQWQsQ0FBQSxvQkFBQWMsQ0FBQSxPQUFBQyxjQUFBLENBQUFDLElBQUEsQ0FBQWhC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