kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
156 lines (153 loc) • 19.4 kB
JavaScript
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 _lib = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react-redux/lib");
var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react"));
var _duckdb = require("@openassistant/duckdb");
var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/actions/src");
var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/processors/src");
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; }
// 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, _lib.useSelector)(function (state) {
return state.demo.keplerGl.map.visState.datasets;
});
var queryInProgress = (0, _react.useRef)(null);
var dispatch = (0, _lib.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, _src2.processFileData)({
content: {
fileName: newDatasetName,
data: jsonResult
},
fileCache: []
});
case 16:
processedData = _context.sent;
// add the new dataset to the map
dispatch((0, _src.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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGliIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX2R1Y2tkYiIsIl9zcmMiLCJfc3JjMiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIlRhYmxlVG9vbENvbXBvbmVudCIsIl9yZWYiLCJzcWwiLCJkYlRhYmxlTmFtZSIsIm5ld0RhdGFzZXROYW1lIiwicXVlcnlEYXRhc2V0TmFtZSIsImRhdGFzZXRzIiwidXNlU2VsZWN0b3IiLCJzdGF0ZSIsImRlbW8iLCJrZXBsZXJHbCIsIm1hcCIsInZpc1N0YXRlIiwicXVlcnlJblByb2dyZXNzIiwidXNlUmVmIiwiZGlzcGF0Y2giLCJ1c2VEaXNwYXRjaCIsIl91c2VTdGF0ZSIsInVzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5MiIsImVycm9yIiwic2V0RXJyb3IiLCJ1c2VFZmZlY3QiLCJuZXdEYXRhc2V0SWQiLCJrZXlzIiwiZmluZCIsImRhdGFJZCIsImxhYmVsIiwiYWRkVGFibGUiLCJfcmVmMiIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlMiIsIndyYXAiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJwcmV2IiwibmV4dCIsImN1cnJlbnQiLCJfY2FsbGVlIiwiZHVja0RCIiwiY29ubiIsImFycm93UmVzdWx0IiwianNvblJlc3VsdCIsInByb2Nlc3NlZERhdGEiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwiZ2V0RHVja0RCIiwic2VudCIsIkVycm9yIiwiY29ubmVjdCIsInF1ZXJ5IiwidG9BcnJheSIsInJvdyIsImNvbnZlcnRBcnJvd1Jvd1RvT2JqZWN0IiwicHJvY2Vzc0ZpbGVEYXRhIiwiY29udGVudCIsImZpbGVOYW1lIiwiZGF0YSIsImZpbGVDYWNoZSIsImFkZERhdGFUb01hcCIsIm9wdGlvbnMiLCJhdXRvQ3JlYXRlTGF5ZXJzIiwiY2VudGVyTWFwIiwiY29uY2F0IiwiY2xvc2UiLCJ0MCIsImNvbnNvbGUiLCJtZXNzYWdlIiwiZmluaXNoIiwic3RvcCIsImFwcGx5IiwiYXJndW1lbnRzIiwiY3JlYXRlRWxlbWVudCIsInN0eWxlIiwiY29sb3IiLCJmb250U2l6ZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9haS1hc3Npc3RhbnQvc3JjL3Rvb2xzL2tlcGxlci10b29scy90YWJsZS10b29sLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3VzZVNlbGVjdG9yfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgUmVhY3QsIHt1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlRGlzcGF0Y2h9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7Z2V0RHVja0RCLCBMb2NhbFF1ZXJ5QWRkaXRpb25hbERhdGEsIGNvbnZlcnRBcnJvd1Jvd1RvT2JqZWN0fSBmcm9tICdAb3BlbmFzc2lzdGFudC9kdWNrZGInO1xuXG5pbXBvcnQge1N0YXRlfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2FpLWFzc2lzdGFudC1tYW5hZ2VyJztcbmltcG9ydCB7YWRkRGF0YVRvTWFwfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtwcm9jZXNzRmlsZURhdGF9IGZyb20gJ0BrZXBsZXIuZ2wvcHJvY2Vzc29ycyc7XG5cbi8vIFRoaXMgY29tcG9uZW50IHdpbGwgY3JlYXRlIGEgbmV3IHRhYmxlIHVzaW5nIHRoZSBTUUwgcXVlcnkgd2hpY2ggd2lsbFxuLy8gMS4gYWRkIGEgbmV3IGNvbHVtblxuLy8gMi4gZGVsZXRlIGEgY29sdW1uXG4vLyAzLiByZW5hbWUgYSBjb2x1bW5cbi8vIDQuIGNoYW5nZSB0aGUgdmFyaWFibGUgdHlwZSBvZiBhIGNvbHVtblxuZXhwb3J0IGZ1bmN0aW9uIFRhYmxlVG9vbENvbXBvbmVudCh7XG4gIHNxbCxcbiAgZGJUYWJsZU5hbWUsXG4gIHF1ZXJ5RGF0YXNldE5hbWU6IG5ld0RhdGFzZXROYW1lXG59OiBMb2NhbFF1ZXJ5QWRkaXRpb25hbERhdGEpIHtcbiAgY29uc3QgZGF0YXNldHMgPSB1c2VTZWxlY3Rvcigoc3RhdGU6IFN0YXRlKSA9PiBzdGF0ZS5kZW1vLmtlcGxlckdsLm1hcC52aXNTdGF0ZS5kYXRhc2V0cyk7XG4gIGNvbnN0IHF1ZXJ5SW5Qcm9ncmVzcyA9IHVzZVJlZjxQcm9taXNlPHZvaWQ+IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcblxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gY2hlY2sgaWYgdGhlIG5ld0RhdGFzZXROYW1lIGlzIGFscmVhZHkgaW4gdGhlIGRhdGFzZXRzXG4gICAgY29uc3QgbmV3RGF0YXNldElkID0gT2JqZWN0LmtleXMoZGF0YXNldHMpLmZpbmQoXG4gICAgICBkYXRhSWQgPT4gZGF0YXNldHNbZGF0YUlkXS5sYWJlbCA9PT0gbmV3RGF0YXNldE5hbWVcbiAgICApO1xuICAgIC8vIGlmIHRoZSBuZXdEYXRhc2V0TmFtZSBpcyBhbHJlYWR5IGluIHRoZSBkYXRhc2V0cywgcmV0dXJuXG4gICAgaWYgKG5ld0RhdGFzZXRJZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgYWRkVGFibGUgPSBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBJZiBhIHF1ZXJ5IGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlXG4gICAgICBpZiAocXVlcnlJblByb2dyZXNzLmN1cnJlbnQpIHtcbiAgICAgICAgYXdhaXQgcXVlcnlJblByb2dyZXNzLmN1cnJlbnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBwcm9taXNlIGZvciB0aGlzIHF1ZXJ5XG4gICAgICBxdWVyeUluUHJvZ3Jlc3MuY3VycmVudCA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZHVja0RCID0gYXdhaXQgZ2V0RHVja0RCKCk7XG4gICAgICAgICAgaWYgKCFkdWNrREIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRHVja0RCIGluc3RhbmNlIGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGJUYWJsZU5hbWUgJiYgc3FsKSB7XG4gICAgICAgICAgICAvLyBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZVxuICAgICAgICAgICAgY29uc3QgY29ubiA9IGF3YWl0IGR1Y2tEQi5jb25uZWN0KCk7XG5cbiAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIHByb3ZpZGVkIFNRTCBxdWVyeVxuICAgICAgICAgICAgY29uc3QgYXJyb3dSZXN1bHQgPSBhd2FpdCBjb25uLnF1ZXJ5KHNxbCk7XG5cbiAgICAgICAgICAgIC8vIGNvbnZlcnQgYXJyb3dSZXN1bHQgdG8gYSBKU09OIG9iamVjdFxuICAgICAgICAgICAgY29uc3QganNvblJlc3VsdCA9IGFycm93UmVzdWx0LnRvQXJyYXkoKS5tYXAocm93ID0+IGNvbnZlcnRBcnJvd1Jvd1RvT2JqZWN0KHJvdykpO1xuXG4gICAgICAgICAgICAvLyB1c2UgcHJvY2Vzc0ZpbGVEYXRhIHRvIHByb2Nlc3MgdGhlIHJvd09iamVjdFxuICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IGF3YWl0IHByb2Nlc3NGaWxlRGF0YSh7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IHtmaWxlTmFtZTogbmV3RGF0YXNldE5hbWUsIGRhdGE6IGpzb25SZXN1bHR9LFxuICAgICAgICAgICAgICBmaWxlQ2FjaGU6IFtdXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gYWRkIHRoZSBuZXcgZGF0YXNldCB0byB0aGUgbWFwXG4gICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgYWRkRGF0YVRvTWFwKHtcbiAgICAgICAgICAgICAgICBkYXRhc2V0czogcHJvY2Vzc2VkRGF0YSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB7YXV0b0NyZWF0ZUxheWVyczogdHJ1ZSwgY2VudGVyTWFwOiB0cnVlfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSB0YWJsZSBmcm9tIHRoZSBkYXRhYmFzZVxuICAgICAgICAgICAgYXdhaXQgY29ubi5xdWVyeShgRFJPUCBUQUJMRSAke2RiVGFibGVOYW1lfWApO1xuXG4gICAgICAgICAgICAvLyBjbG9zZSB0aGUgY29ubmVjdGlvblxuICAgICAgICAgICAgYXdhaXQgY29ubi5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICBzZXRFcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yIG9jY3VycmVkJyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcXVlcnlJblByb2dyZXNzLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICAvLyBXYWl0IGZvciB0aGUgcXVlcnkgdG8gY29tcGxldGVcbiAgICAgIGF3YWl0IHF1ZXJ5SW5Qcm9ncmVzcy5jdXJyZW50O1xuICAgIH07XG5cbiAgICBhZGRUYWJsZSgpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW10pO1xuXG4gIHJldHVybiBlcnJvciA/IDxkaXYgc3R5bGU9e3tjb2xvcjogJ3JlZCcsIGZvbnRTaXplOiAnOHB4J319PntlcnJvcn08L2Rpdj4gOiBudWxsO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLElBQUFBLElBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUdBLElBQUFJLElBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLEtBQUEsR0FBQUwsT0FBQTtBQUFzRCxTQUFBTSx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQUwsd0JBQUFLLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFBLE9BQUFRLENBQUEsS0FBQUMsU0FBQSxVQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FBQSxJQUFBRCxNQUFBLENBQUFFLHdCQUFBLFdBQUFDLENBQUEsSUFBQWQsQ0FBQSxvQkFBQWMsQ0FBQSxPQUFBQyxjQUFBLENBQUFDLElBQUEsQ0FBQWhCLENBQUEsRUFBQWMsQ0FBQSxTQUFBRyxDQUFBLEdBQUFQLENBQUEsR0FBQUMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBYixDQUFBLEVBQUFjLENBQUEs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
;