datafolder 1.0.5 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -1
- package/data/sampleDataFolder/qykv/history/acl/1_acl.txt +1 -0
- package/data/sampleDataFolder/qykv/history/acl/2_acl.txt +1 -0
- package/data/sampleDataFolder/qykv/history/acl/3_acl.txt +1 -0
- package/data/sampleDataFolder/qykv/history/acl/4_acl.txt +1 -0
- package/data/sampleDataFolder/qykv/history/acl/5_acl.txt +1 -0
- package/data/sampleDataFolder/qykv/snapshot/1/1_pM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/1/1_prefixPM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/1/1_vL.txt +10 -0
- package/data/sampleDataFolder/qykv/snapshot/2/1_pM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/2/1_prefixPM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/2/1_vL.txt +1 -0
- package/data/sampleDataFolder/qykv/snapshot/3/1_pM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/3/1_prefixPM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/3/1_vL.txt +1 -0
- package/data/sampleDataFolder/qykv/snapshot/4/1_pM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/4/1_prefixPM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/4/1_vL.txt +1 -0
- package/data/sampleDataFolder/qykv/snapshot/4/2_pM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/4/2_prefixPM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/4/2_vL.txt +9 -0
- package/data/sampleDataFolder/qykv/snapshot/5/1_pM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/5/1_prefixPM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/5/1_vL.txt +55 -0
- package/data/sampleDataFolder/qykv/snapshot/info/1.json +1 -0
- package/data/sampleDataFolder/qykv/snapshot/info/2.json +1 -0
- package/data/sampleDataFolder/qykv/snapshot/info/3.json +1 -0
- package/data/sampleDataFolder/qykv/snapshot/info/4.json +1 -0
- package/data/sampleDataFolder/qykv/snapshot/info/5.json +1 -0
- package/data/sampleDataFolder/qylog/2026/02/15/08/change.txt +58 -0
- package/data/sampleDataFolder/qylog/2026/02/15/08/stderr.txt +11 -0
- package/data/sampleDataFolder/qylog/2026/02/15/08/stdout.txt +36 -0
- package/package.json +1 -1
- package/sample.js +19 -19
- package/src/QyAcl.js +44 -44
- package/src/QyAclSaver_Worker.js +2 -2
- package/src/QyAclWriter.js +1 -1
- package/src/QyBatch.js +1 -3
- package/src/QyBinWriter.js +65 -66
- package/src/QyCD.js +63 -27
- package/src/QyCache.js +33 -33
- package/src/QyDB.js +4 -30
- package/src/QyDefaultOptions.js +2 -1
- package/src/QyFetch.js +4 -22
- package/src/QyFileLogger.js +2 -2
- package/src/QyKVData.js +159 -183
- package/src/QyKVDataCleaner_Worker.js +15 -14
- package/src/QyKVDataSaver_Worker.js +16 -16
- package/src/QyLogFileSaver.js +1 -1
- package/src/QyLogFileSaver_Worker.js +2 -2
- package/src/QyMod.js +7 -7
- package/src/QyOpRunner.js +19 -16
- package/src/QySnapshotCompactor_Worker.js +37 -36
- package/src/QySnapshotSaver_Worker.js +2 -2
- package/src/QySnapshots.js +141 -139
- package/src/QyUnionNode.js +2 -2
- package/src/rpc/evalCode.js +4 -4
- package/src/rpc/getFileContent.js +4 -4
- package/src/rpc/getSubItems.js +12 -12
- package/src/rpc/queryFiles.js +1 -1
- package/static/codemirror.bundle/editor.bundle.js +27906 -0
- package/static/datafolderui/QyUIFolderTree.js +121 -145
- package/static/datafolderui/QyUIUtils.js +9 -4
- package/static/datafolderui/code-mirror.js +35 -0
- package/static/datafolderui/display-tree.js +52 -86
- package/static/datafolderui/explore-tree.js +66 -81
- package/static/datafolderui/index.css +7 -0
- package/static/datafolderui/index.html +1 -0
- package/static/datafolderui/main-page.js +34 -55
- package/static/datafolderui/query-editor.js +178 -198
|
@@ -1,234 +1,214 @@
|
|
|
1
1
|
import {
|
|
2
|
-
w2popup
|
|
2
|
+
w2popup as o
|
|
3
3
|
} from "../w2ui/src/w2compat.js";
|
|
4
4
|
|
|
5
5
|
import {
|
|
6
|
-
h
|
|
6
|
+
h as n
|
|
7
7
|
} from "./hscrpt.js";
|
|
8
8
|
|
|
9
9
|
import {
|
|
10
|
-
rpc
|
|
10
|
+
rpc as i
|
|
11
11
|
} from "./QyUIUtils.js";
|
|
12
12
|
|
|
13
|
-
import {} from "./list-input.js";
|
|
14
|
-
|
|
15
|
-
import {} from "./kv-input.js";
|
|
16
|
-
|
|
17
13
|
import {
|
|
18
|
-
setWidth
|
|
14
|
+
setWidth as s
|
|
19
15
|
} from "./QyUIUtils.js";
|
|
20
16
|
|
|
21
|
-
import
|
|
17
|
+
import "./display-tree.js";
|
|
18
|
+
|
|
19
|
+
let a = "localStorage_queryFun_map", u = new Event("run");
|
|
20
|
+
|
|
21
|
+
async function l(t, e) {
|
|
22
|
+
var {
|
|
23
|
+
queryId: r,
|
|
24
|
+
displayTree: o
|
|
25
|
+
} = t, {
|
|
26
|
+
tree: e,
|
|
27
|
+
count: n,
|
|
28
|
+
error: s
|
|
29
|
+
} = (++t.queryId, await i("evalCode", e));
|
|
30
|
+
r + 1 == t.queryId && (s ? o.showMsg(s) : o.showTree(e, n));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function c(s) {
|
|
34
|
+
return s.body = n("div", {
|
|
35
|
+
classList: "container-fluid",
|
|
36
|
+
style: "margin-top:1px;"
|
|
37
|
+
}, [ s.codemirror = n("code-mirror", {
|
|
38
|
+
changeCallback: t => {
|
|
39
|
+
var e = s, {
|
|
40
|
+
titleSet: r,
|
|
41
|
+
funName: o,
|
|
42
|
+
queryFunctions: n
|
|
43
|
+
} = e;
|
|
44
|
+
r && t.docChanged && (r = t.state.doc.toString(), t = e.textChanged = r != n[o],
|
|
45
|
+
p(b(r) + (t ? "*" : "")));
|
|
46
|
+
}
|
|
47
|
+
}) ]);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function d(t, e) {
|
|
51
|
+
var {
|
|
52
|
+
queryInput: r,
|
|
53
|
+
codemirror: o,
|
|
54
|
+
queryFunctions: n
|
|
55
|
+
} = t, n = n[t.funName = e] ?? "";
|
|
56
|
+
r.value = n, t.titleSet = !1, o.text = n, p(e), o.clearHistory(), Object.assign(t, {
|
|
57
|
+
titleSet: !0,
|
|
58
|
+
textChanged: !1
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function p(t) {
|
|
63
|
+
var e = document.querySelector("#w2ui-popup .w2ui-popup-title");
|
|
64
|
+
e && (e.innerText = t);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function m(t, e) {
|
|
68
|
+
var {
|
|
69
|
+
dropDownUL: r,
|
|
70
|
+
dropdownItemMap: o
|
|
71
|
+
} = t;
|
|
72
|
+
e in o || (o = o[e] = n("li", [ n("span", {
|
|
73
|
+
classList: "dropdown-item",
|
|
74
|
+
style: "cursor:pointer;",
|
|
75
|
+
onclick: () => d(t, e)
|
|
76
|
+
}, [ e ]) ]), r.append(o));
|
|
77
|
+
}
|
|
22
78
|
|
|
23
|
-
|
|
79
|
+
function g(t) {
|
|
80
|
+
localStorage.setItem(a, JSON.stringify(t));
|
|
81
|
+
}
|
|
24
82
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
83
|
+
function y(t) {
|
|
84
|
+
var {
|
|
85
|
+
queryFunctions: e,
|
|
86
|
+
codemirror: r,
|
|
87
|
+
textChanged: o
|
|
88
|
+
} = t;
|
|
89
|
+
o && (o = r.text, o) && (m(t, r = b(o)), e[r] = o, g(e), d(t, r));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function f(t) {
|
|
93
|
+
var e, r, o, {
|
|
94
|
+
queryFunctions: n,
|
|
95
|
+
codemirror: s
|
|
96
|
+
} = t, s = s.text;
|
|
97
|
+
s && (s = b(s), r = s, (o = (e = (e = t).dropdownItemMap)[r]) && (o.remove(),
|
|
98
|
+
delete e[r]), delete n[s], g(n), d(t, Object.keys(n)[0]));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function b(t) {
|
|
102
|
+
t = /^\s*function\s+(\w+)\(/.exec(t);
|
|
103
|
+
return t ? t[1] : void 0;
|
|
104
|
+
}
|
|
46
105
|
|
|
47
106
|
customElements.define("query-editor", class extends HTMLElement {
|
|
48
107
|
constructor() {
|
|
49
108
|
super();
|
|
50
109
|
}
|
|
51
110
|
compose() {
|
|
52
|
-
this
|
|
111
|
+
var t = this, e = {
|
|
112
|
+
getFlightsByDate: `function getFlightsByDate() {
|
|
113
|
+
return dataFolder.queryTree(["flights", "*", 1, (x) => x >= 5 && x <= 7], {
|
|
114
|
+
$or: [{ _from: "airports/BIS" }, { _to: "airports/BIS" }],
|
|
115
|
+
});
|
|
116
|
+
}`,
|
|
117
|
+
getFlightDistances: `function getFlightDistances() {
|
|
118
|
+
return dataFolder.queryTree(
|
|
119
|
+
["flights", "*", 1, (x) => x >= 1 && x <= 7],
|
|
120
|
+
{
|
|
121
|
+
$or: [{ _from: "airports/BIS" }, { _to: "airports/BIS" }],
|
|
122
|
+
},
|
|
123
|
+
["Distance"],
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
`,
|
|
127
|
+
getHotels: `function getHotels() {
|
|
128
|
+
return dataFolder.queryTree(
|
|
129
|
+
["airbnb", "Loft", "Entire home/apt", "Real Bed"],
|
|
130
|
+
{
|
|
131
|
+
address: { street: "Porto, Porto, Portugal" },
|
|
132
|
+
},
|
|
133
|
+
["name"],
|
|
134
|
+
9,
|
|
135
|
+
9,
|
|
136
|
+
);
|
|
137
|
+
}`
|
|
138
|
+
}, r = localStorage.getItem(a);
|
|
139
|
+
r && Object.assign(e, JSON.parse(r)), Object.assign(t, {
|
|
140
|
+
queryFunctions: e,
|
|
141
|
+
queryId: 0,
|
|
142
|
+
funName: "getFlightsByDate",
|
|
143
|
+
dropdownItemMap: {}
|
|
144
|
+
}), this.append(n("div", {
|
|
53
145
|
classList: "btn-toolbar",
|
|
54
146
|
role: "toolbar",
|
|
55
147
|
style: {
|
|
56
148
|
"border-bottom": "1px solid #e4e4e4"
|
|
57
149
|
}
|
|
58
|
-
}, [
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
cursorInput: i
|
|
74
|
-
} = this;
|
|
75
|
-
return `{folder:${t.text},value:${e.text},view:${r.text} ${s.text} ${i.text}}`;
|
|
76
|
-
}
|
|
77
|
-
_createDisplayTree() {
|
|
78
|
-
return h("div", [ this.displayTree = h("display-tree") ]);
|
|
79
|
-
}
|
|
80
|
-
_createSaveButton() {
|
|
81
|
-
return h("div", {
|
|
82
|
-
classList: "btn-group btn-group-sm me-2",
|
|
83
|
-
role: "group"
|
|
84
|
-
}, [ h("button", {
|
|
85
|
-
classList: "btn btn-primary",
|
|
86
|
-
type: "button",
|
|
87
|
-
onclick: () => {
|
|
88
|
-
console.log("Save");
|
|
89
|
-
}
|
|
90
|
-
}, [ "Save" ]) ]);
|
|
91
|
-
}
|
|
92
|
-
_createEditButton() {
|
|
93
|
-
return h("div", {
|
|
94
|
-
classList: "btn-group btn-group-sm me-2",
|
|
95
|
-
role: "group"
|
|
96
|
-
}, [ this.editButton = h("button", {
|
|
97
|
-
classList: "btn btn-primary",
|
|
98
|
-
type: "button",
|
|
99
|
-
onclick: () => this._toggleEditor()
|
|
100
|
-
}, [ "Edit" ]) ]);
|
|
101
|
-
}
|
|
102
|
-
_createRunButton() {
|
|
103
|
-
return h("div", {
|
|
104
|
-
classList: "btn-group btn-group-sm me-2",
|
|
105
|
-
role: "group"
|
|
106
|
-
}, [ h("button", {
|
|
107
|
-
classList: "btn btn-primary",
|
|
108
|
-
type: "button",
|
|
109
|
-
onclick: () => this._queryFiles()
|
|
110
|
-
}, [ "Run" ]) ]);
|
|
111
|
-
}
|
|
112
|
-
_createQueryInput() {
|
|
113
|
-
return h("div", {
|
|
150
|
+
}, [ (t => {
|
|
151
|
+
var e, r = t.dropDownUL = n("ul", {
|
|
152
|
+
classList: "dropdown-menu"
|
|
153
|
+
}), o = t;
|
|
154
|
+
for (e in o.queryFunctions) m(o, e);
|
|
155
|
+
return n("div", {
|
|
156
|
+
classList: "btn-group btn-grou-sm"
|
|
157
|
+
}, [ n("button", {
|
|
158
|
+
classList: "btn btn-success dropdown-toggle",
|
|
159
|
+
type: "button",
|
|
160
|
+
"data-bs-toggle": "dropdown"
|
|
161
|
+
}, [ n("i", {
|
|
162
|
+
classList: "bi bi-clock"
|
|
163
|
+
}) ]), r ]);
|
|
164
|
+
})(r = this), (t => n("div", {
|
|
114
165
|
classList: "input-group me-auto"
|
|
115
|
-
}, [
|
|
166
|
+
}, [ t.queryInput = n("input", {
|
|
116
167
|
id: "queryInput",
|
|
117
168
|
type: "text",
|
|
118
169
|
classList: "form-control",
|
|
119
170
|
attrs: {
|
|
120
171
|
readonly: !0
|
|
121
172
|
}
|
|
122
|
-
}) ])
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
} = this;
|
|
155
|
-
try {
|
|
156
|
-
eval("((x)=>x)(" + queryText + ")");
|
|
157
|
-
} catch (exception) {
|
|
158
|
-
return void displayTree.showMsg(exception.message);
|
|
159
|
-
}
|
|
160
|
-
++this.queryId;
|
|
161
|
-
let {
|
|
162
|
-
tree,
|
|
163
|
-
count
|
|
164
|
-
} = await rpc("queryFiles", queryText);
|
|
165
|
-
queryId + 1 == this.queryId && displayTree.showTree(tree, count);
|
|
166
|
-
}
|
|
167
|
-
_toggleEditor() {
|
|
168
|
-
"closed" == w2popup.status ? w2popup.open({
|
|
169
|
-
title: "Edit Query",
|
|
170
|
-
body: this._getPopupBody(),
|
|
171
|
-
blockPage: !1,
|
|
172
|
-
resizable: !0,
|
|
173
|
-
width: 700,
|
|
174
|
-
height: 290,
|
|
175
|
-
actions: {
|
|
176
|
-
Run: () => {
|
|
177
|
-
this.dispatchEvent(eventRun), this._queryFiles();
|
|
178
|
-
},
|
|
179
|
-
Save: () => {}
|
|
180
|
-
}
|
|
181
|
-
}) : w2popup.close();
|
|
182
|
-
}
|
|
183
|
-
_createBody() {
|
|
184
|
-
var {
|
|
185
|
-
folder: t,
|
|
186
|
-
value: e,
|
|
187
|
-
view: r
|
|
188
|
-
} = historyQueryList[0], s = this.body = h("div", {
|
|
189
|
-
classList: "container-fluid"
|
|
190
|
-
}), i = {
|
|
191
|
-
input: () => this._updateQueryText()
|
|
192
|
-
}, t = h("list-input", {
|
|
193
|
-
label: "folder",
|
|
194
|
-
on: i
|
|
195
|
-
}).set(t), e = h("kv-input", {
|
|
196
|
-
label: "value",
|
|
197
|
-
on: i
|
|
198
|
-
}).set(e), r = h("list-input", {
|
|
199
|
-
label: "view",
|
|
200
|
-
on: i
|
|
201
|
-
}).set(r), i = h("div", {
|
|
202
|
-
classList: "row align-items-center p-1"
|
|
203
|
-
}, [ this.limitInput = h("num-input", {
|
|
204
|
-
label: "limit",
|
|
205
|
-
on: i
|
|
206
|
-
}), this.cursorInput = h("num-input", {
|
|
207
|
-
label: "cursor",
|
|
208
|
-
on: i
|
|
209
|
-
}) ]);
|
|
210
|
-
return s.append(t, e, r, i), Object.assign(this, {
|
|
211
|
-
folderList: t,
|
|
212
|
-
matchKVList: e,
|
|
213
|
-
viewList: r
|
|
214
|
-
}), this._updateQueryText(), s;
|
|
173
|
+
}) ]))(r), ...(r => {
|
|
174
|
+
var t = [ [ "Edit", () => {
|
|
175
|
+
var t, e = r;
|
|
176
|
+
"closed" == o.status ? (t = {
|
|
177
|
+
Run: () => {
|
|
178
|
+
e.dispatchEvent(u), l(e, e.codemirror.text);
|
|
179
|
+
},
|
|
180
|
+
Save: () => y(e),
|
|
181
|
+
Delete: () => f(e)
|
|
182
|
+
}, o.open({
|
|
183
|
+
title: e.funName,
|
|
184
|
+
body: (t => t.body || c(t))(e),
|
|
185
|
+
blockPage: !1,
|
|
186
|
+
resizable: !0,
|
|
187
|
+
width: 800,
|
|
188
|
+
height: 400,
|
|
189
|
+
actions: t
|
|
190
|
+
})) : o.close();
|
|
191
|
+
} ], [ "Run", () => l(r, r.queryInput.value) ], [ "Save", () => y(r) ], [ "Delete", () => f(r) ] ].map(([ t, e ]) => n("div", {
|
|
192
|
+
classList: "btn-group btn-group-sm me-2",
|
|
193
|
+
role: "group"
|
|
194
|
+
}, [ n("button", {
|
|
195
|
+
classList: "btn btn-primary",
|
|
196
|
+
type: "button",
|
|
197
|
+
onclick: e
|
|
198
|
+
}, [ t ]) ]));
|
|
199
|
+
return r.firstButton = t[0], t.map(t => n("div", {
|
|
200
|
+
classList: "btn-group btn-group-sm me-2",
|
|
201
|
+
role: "group"
|
|
202
|
+
}, [ t ]));
|
|
203
|
+
})(r) ]), n("div", [ this.displayTree = n("display-tree") ])), c(this),
|
|
204
|
+
d(this, this.funName);
|
|
215
205
|
}
|
|
216
|
-
|
|
217
|
-
return this.body || this._createBody();
|
|
218
|
-
}
|
|
219
|
-
_updateQueryText() {
|
|
220
|
-
this.queryInput.value = this.queryText;
|
|
221
|
-
}
|
|
222
|
-
_setQueryFromHistory(t) {
|
|
206
|
+
onSizeChange() {
|
|
223
207
|
var {
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
} = this
|
|
228
|
-
|
|
229
|
-
value: i,
|
|
230
|
-
view: o
|
|
231
|
-
} = t;
|
|
232
|
-
e.set(t), r.set(i), s.set(o), this._updateQueryText();
|
|
208
|
+
queryInput: t,
|
|
209
|
+
firstButton: e,
|
|
210
|
+
displayTree: r
|
|
211
|
+
} = this;
|
|
212
|
+
s(t, e.parentElement.offsetLeft - t.parentElement.offsetLeft), r.onSizeChange();
|
|
233
213
|
}
|
|
234
214
|
});
|