-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfront-model.js
147 lines (137 loc) · 3.34 KB
/
front-model.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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
"use strict"
function getTreeNode(arg){
if(!arg){
arg = {}
}
var edgeSize = arg.edgeSize || 128
var TreeNode = arg.local || localforage;
var savePeriod = arg.savePeriod || 1000
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
TreeNode.dropData = TreeNode.clear;
TreeNode.tmp = {}
TreeNode.lock = {}
TreeNode.flag = {}
TreeNode.getTreeName = function(x,y){
return `${x}_${y}`
}
TreeNode.getTreeTimeName = function(x,y){
return `T${x}_${y}`
}
TreeNode.setTreeTime = async function(x,y,t){
await this.setItem(this.getTreeTimeName(x,y),t.toString())
}
TreeNode.getTreeTime = async function(x,y){
var res = await this.getItem(this.getTreeTimeName(x,y))
//console.log(x,y,res)
if(res){
return {x,y,time:parseInt(res)};
}else{
return {x,y,time:0};
}
}
TreeNode.queryTime = async function(x1,y1,x2,y2){
var xs = Math.floor(x1/edgeSize)
var xe = Math.floor(x2/edgeSize)
var ys = Math.floor(y1/edgeSize)
var ye = Math.floor(y2/edgeSize)
var meta = [];
for(var x=xs;x<=xe;x++){
for(var y=ys;y<=ye;y++){
meta.push(this.getTreeTime(x,y))
}
}
return await Promise.all(meta)
}
TreeNode.query = async function(queryList){
var meta = []
for(var i of queryList){
var name = this.getTreeName(i.x,i.y)
if(typeof this.queried == "undefined"){
this.queried = new Set()
}
if(!this.queried.has(name)){
meta.push(this.queryOne(name))
this.queried.add(name)
}
}
return await Promise.all(meta)
}
TreeNode.queryOne = async function(key){
var res = await this.getItem(key)
if(res){
return JSON.parse(res)
}else{
return []
}
}
TreeNode.addPoints = function(data){
var meta = []
for(var i of data){
var x = Math.floor(i.x/edgeSize)
var y = Math.floor(i.y/edgeSize)
var keyName = this.getTreeName(x,y)
i.t = (new Date(i.t)).getTime()
if(i._id){
delete i._id
}
if(typeof this.tmp[keyName] == "undefined"){
this.tmp[keyName] = [i]
}else{
this.tmp[keyName].push(i)
}
if(!this.flag[keyName]){
this.flag[keyName] = 1
var tmp = keyName
setTimeout(this.addPointsOne(tmp,this),savePeriod)
}
}
}
TreeNode.addPointsOne = (key,that)=>async()=>{
while(that.lock[key]){
await sleep(savePeriod)
}
that.lock[key] = 1
delete that.flag[key]
var preTmp = that.tmp[key]
delete that.tmp[key]
var preTree = that.getItem(key)
var tmp = []
for(var i=0;i<preTmp.length;i++){
var flag = true
for(var j=i+1;j<preTmp.length;j++){
if(preTmp[i].x == preTmp[j].x && preTmp[i].y == preTmp[j].y){
flag = false;
break
}
}
if(flag){
tmp.push(preTmp[i])
}
}
var tree = await preTree
if(tree){
tree = JSON.parse(tree)
}else{
tree = []
}
var newTree = []
for(var i of tree){
var flag = true
for(var j of tmp){
if(i.x == j.x && i.y == j.y){
flag = false;
break
}
}
if(flag){
newTree.push(i)
}
}
var res = JSON.stringify(newTree.concat(tmp))
await that.setItem(key,res)
delete that.lock[key]
}
return TreeNode
}