Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
J
jio
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Romain Courteaud
jio
Commits
f9bdfa9b
Commit
f9bdfa9b
authored
Jun 28, 2018
by
Bryan Kaperick
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Finished revisions to buildquery.
parent
c6db8c50
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
534 additions
and
43 deletions
+534
-43
src/jio.storage/historystorage.js
src/jio.storage/historystorage.js
+102
-30
test/jio.storage/historystorage.tests.js
test/jio.storage/historystorage.tests.js
+432
-13
No files found.
src/jio.storage/historystorage.js
View file @
f9bdfa9b
...
...
@@ -44,6 +44,7 @@
*/
function
HistoryStorage
(
spec
)
{
this
.
_sub_storage
=
jIO
.
createJIO
(
spec
.
sub_storage
);
this
.
_include_revisions
=
spec
.
include_revisions
;
}
HistoryStorage
.
prototype
.
get
=
function
(
id_in
)
{
...
...
@@ -358,7 +359,7 @@
// Query for all edits putting or removing documents (and nothing about
// attachments)
meta_options
=
{
query
:
"
(op: remove) OR (op: put)
"
,
query
:
"
"
,
//
(op: remove) OR (op: put)",
sort_on
:
options
.
sort_on
};
return
this
.
_sub_storage
.
allDocs
(
meta_options
)
...
...
@@ -376,44 +377,115 @@
query_matches
,
docs_to_query
,
i
;
// If !rev_query, then by default only consider latest revisions of
// documents
results
=
results
.
filter
(
function
(
docum
)
{
if
(
rev_query
)
{
return
docum
.
op
===
"
put
"
;
}
if
(
!
seen
.
hasOwnProperty
(
docum
.
doc_id
))
{
seen
[
docum
.
doc_id
]
=
{};
return
docum
.
op
===
"
put
"
;
}
return
false
;
});
// If any documents have property _doc_id, __doc_id, etc, then set
// doc_id_name to the first string which is not a property of any
// of the documents
doc_id_name
=
"
_doc_id
"
;
timestamp_name
=
"
_timestamp
"
;
for
(
i
=
0
;
i
<
results
.
length
;
i
+=
1
)
{
while
(
results
[
i
].
doc
.
hasOwnProperty
(
doc_id_name
))
{
doc_id_name
=
"
_
"
+
doc_id_name
;
}
while
(
results
[
i
].
doc
.
hasOwnProperty
(
timestamp_name
))
{
timestamp_name
=
"
_
"
+
timestamp_name
;
if
(
results
[
i
].
op
===
"
put
"
)
{
while
(
results
[
i
].
doc
.
hasOwnProperty
(
doc_id_name
))
{
doc_id_name
=
"
_
"
+
doc_id_name
;
}
while
(
results
[
i
].
doc
.
hasOwnProperty
(
timestamp_name
))
{
timestamp_name
=
"
_
"
+
timestamp_name
;
}
}
}
docs_to_query
=
results
.
map
(
function
(
docum
)
{
// If it's a "remove" operation then it has no doc property
if
(
!
docum
.
hasOwnProperty
(
"
doc
"
))
{
docum
.
doc
=
{};
}
docum
.
doc
[
doc_id_name
]
=
docum
.
doc_id
;
docum
.
doc
[
timestamp_name
]
=
docum
.
timestamp
;
return
docum
.
doc
;
});
if
(
rev_query
)
{
// Only query on documents which are puts are putAttachments
results
=
results
.
map
(
function
(
docum
,
ind
)
{
var
data_key
;
if
(
docum
.
op
===
"
put
"
)
{
return
docum
;
}
if
(
docum
.
op
===
"
putAttachment
"
)
{
docum
.
doc
=
{};
for
(
i
=
ind
+
1
;
i
<
results
.
length
;
i
+=
1
)
{
if
(
results
[
i
].
doc_id
===
docum
.
doc_id
)
{
if
(
results
[
i
].
op
===
"
put
"
)
{
for
(
data_key
in
results
[
i
].
doc
)
{
if
(
results
[
i
].
doc
.
hasOwnProperty
(
data_key
))
{
docum
.
doc
[
data_key
]
=
results
[
i
].
doc
[
data_key
];
}
}
return
docum
;
}
if
(
results
[
i
].
doc_id
===
"
remove
"
)
{
//console.log("not returning putAttachment at ",
// docum.timestamp,
// " because it was attached to a removed document");
return
false
;
}
}
}
}
return
false
;
});
}
else
{
results
=
results
.
map
(
function
(
docum
,
ind
)
{
var
data_key
;
if
(
docum
.
op
===
"
put
"
)
{
if
(
!
seen
.
hasOwnProperty
(
docum
.
doc_id
))
{
seen
[
docum
.
doc_id
]
=
{};
//console.log("returning put at ", docum.timestamp,
// " because it is most recent edit to " + docum.doc_id);
return
docum
;
}
//console.log("not returning put at ", docum.timestamp,
// " because it was edited later");
}
else
if
(
docum
.
op
===
"
remove
"
)
{
seen
[
docum
.
doc_id
]
=
{};
}
else
if
(
docum
.
op
===
"
putAttachment
"
)
{
if
(
!
seen
.
hasOwnProperty
(
docum
.
doc_id
))
{
seen
[
docum
.
doc_id
]
=
{};
docum
.
doc
=
{};
for
(
i
=
ind
+
1
;
i
<
results
.
length
;
i
+=
1
)
{
if
(
results
[
i
].
doc_id
===
docum
.
doc_id
)
{
if
(
results
[
i
].
op
===
"
put
"
)
{
for
(
data_key
in
results
[
i
].
doc
)
{
if
(
results
[
i
].
doc
.
hasOwnProperty
(
data_key
))
{
docum
.
doc
[
data_key
]
=
results
[
i
].
doc
[
data_key
];
}
}
/**console.log("returning putAttachment at ",
docum.timestamp,
" because it is most recent edit to attachment " +
docum.name + " of document " + docum.doc_id);
**/
return
docum
;
}
if
(
results
[
i
].
doc_id
===
"
remove
"
)
{
/**console.log("not returning putAttachment at ",
docum.timestamp,
" because it was attached to a removed document");
**/
return
false
;
}
}
}
}
}
else
if
(
docum
.
op
===
"
removeAttachment
"
)
{
seen
[
docum
.
doc_id
]
=
{};
}
return
false
;
});
}
docs_to_query
=
results
.
filter
(
function
(
docum
)
{
return
docum
;
})
.
map
(
function
(
docum
)
{
docum
.
doc
[
timestamp_name
]
=
docum
.
timestamp
;
docum
.
doc
[
doc_id_name
]
=
docum
.
doc_id
;
return
docum
.
doc
;
});
options
.
select_list
.
push
(
doc_id_name
);
options
.
select_list
.
push
(
timestamp_name
);
options
.
sort_on
[
options
.
sort_on
.
length
-
1
]
=
[
timestamp_name
,
"
descending
"
];
query_matches
=
options
.
query
.
exec
(
docs_to_query
,
options
);
return
query_matches
;
})
...
...
test/jio.storage/historystorage.tests.js
View file @
f9bdfa9b
...
...
@@ -254,7 +254,7 @@
"
attacheddata
"
:
blob2
,
"
other_attacheddata
"
:
other_blob
},
"
allAttachments works as expected.
"
);
return
jio
.
removeAttachment
(
"
doc
"
,
"
attacheddata
"
);
return
jio
.
removeAttachment
(
"
doc
"
,
"
attacheddata
"
);
//
})
.
push
(
function
()
{
return
jio
.
get
(
"
doc
"
);
...
...
@@ -279,7 +279,7 @@
deepEqual
(
results
,
{
"
other_attacheddata
"
:
blob2
},
"
allAttachments works as expected with a removed attachment
"
);
return
jio
.
putAttachment
(
"
doc
"
,
"
attacheddata
"
,
blob3
);
return
jio
.
putAttachment
(
"
doc
"
,
"
attacheddata
"
,
blob3
);
//
})
.
push
(
function
()
{
return
not_history
.
allDocs
();
...
...
@@ -320,7 +320,7 @@
})
.
push
(
function
(
result
)
{
deepEqual
(
result
,
{
"
title
"
:
"
foo0
"
"
key
"
:
"
val
"
},
"
Get second document accessible from jio storage
"
);
return
not_history
.
allDocs
();
...
...
@@ -1314,19 +1314,19 @@
doc
:
{},
id
:
"
doc
"
,
value
:
{
date
:
1
},
timestamp
:
timestamps
[
1
]
timestamp
:
timestamps
[
2
]
},
{
doc
:
{},
id
:
"
third_doc
"
,
value
:
{
date
:
2
},
timestamp
:
timestamps
[
5
]
timestamp
:
timestamps
[
6
]
},
{
doc
:
{},
id
:
"
second_doc
"
,
value
:
{
date
:
2
},
timestamp
:
timestamps
[
3
]
timestamp
:
timestamps
[
4
]
}
],
"
Query gives correct results in correct order
"
);
...
...
@@ -1543,9 +1543,7 @@
return
jio
.
allDocs
({
query
:
"
NOT (date: >= 2 AND date: <= 3)
"
,
select_list
:
[
"
date
"
,
"
non-existent-key
"
,
"
type
"
,
"
title
"
],
sort_on
:
[[
"
date
"
,
"
descending
"
],
[
"
non-existent-key
"
,
"
ascending
"
],
[
"
_timestamp
"
,
"
ascending
"
]
sort_on
:
[[
"
date
"
,
"
descending
"
]
],
include_revisions
:
true
});
...
...
@@ -1554,13 +1552,13 @@
deepEqual
(
results
.
data
.
rows
,
[
{
doc
:
{},
id
:
"
doc
"
,
id
:
"
second_
doc
"
,
value
:
{
date
:
4
,
title
:
"
doc
"
,
type
:
"
foo
2
"
title
:
"
second_
doc
"
,
type
:
"
bar
2
"
},
timestamp
:
timestamps
[
5
]
timestamp
:
timestamps
[
9
]
},
{
doc
:
{},
...
...
@@ -1572,6 +1570,37 @@
},
timestamp
:
timestamps
[
8
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
date
:
4
,
title
:
"
doc
"
,
type
:
"
foo2
"
},
timestamp
:
timestamps
[
6
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
date
:
4
,
title
:
"
doc
"
,
type
:
"
foo2
"
},
timestamp
:
timestamps
[
5
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
date
:
1
,
title
:
"
doc
"
,
type
:
"
foo
"
},
timestamp
:
timestamps
[
2
]
},
{
doc
:
{},
id
:
"
doc
"
,
...
...
@@ -1597,4 +1626,394 @@
})
.
always
(
function
()
{
start
();
});
});
module
(
"
HistoryStorage.Full-Example
"
,
{
setup
:
function
()
{
// create storage of type "history" with memory as substorage
var
dbname
=
"
db_
"
+
Date
.
now
();
this
.
blob1
=
new
Blob
([
'
a
'
]);
this
.
blob2
=
new
Blob
([
'
b
'
]);
this
.
blob3
=
new
Blob
([
'
ccc
'
]);
this
.
other_blob
=
new
Blob
([
'
1
'
]);
this
.
jio
=
jIO
.
createJIO
({
type
:
"
history
"
,
sub_storage
:
{
type
:
"
query
"
,
sub_storage
:
{
type
:
"
uuid
"
,
sub_storage
:
{
type
:
"
indexeddb
"
,
database
:
dbname
}
}
}
});
this
.
not_history
=
jIO
.
createJIO
({
type
:
"
query
"
,
sub_storage
:
{
type
:
"
uuid
"
,
sub_storage
:
{
type
:
"
indexeddb
"
,
database
:
dbname
}
}
});
}
});
test
(
"
Retrieving history with attachments
"
,
function
()
{
stop
();
expect
(
1
);
var
jio
=
this
.
jio
,
not_history
=
this
.
not_history
,
timestamps
,
blobs1
=
[
new
Blob
([
'
a
'
]),
new
Blob
([
'
ab
'
]),
new
Blob
([
'
abc
'
]),
new
Blob
([
'
abcd
'
]),
new
Blob
([
'
abcde
'
])
],
blobs2
=
[
new
Blob
([
'
abcdef
'
]),
new
Blob
([
'
abcdefg
'
]),
new
Blob
([
'
abcdefgh
'
]),
new
Blob
([
'
abcdefghi
'
]),
new
Blob
([
'
abcdefghij
'
])
];
putFullDoc
(
jio
,
"
doc
"
,
{
title
:
"
bar
"
},
"
data
"
,
blobs1
[
0
])
.
push
(
function
()
{
return
putFullDoc
(
jio
,
"
doc
"
,
{
title
:
"
bar0
"
},
"
data
"
,
blobs1
[
1
]);
})
.
push
(
function
()
{
return
putFullDoc
(
jio
,
"
doc
"
,
{
title
:
"
bar1
"
},
"
data
"
,
blobs1
[
2
]);
})
.
push
(
function
()
{
return
putFullDoc
(
jio
,
"
doc2
"
,
{
title
:
"
foo0
"
},
"
data
"
,
blobs2
[
0
]);
})
.
push
(
function
()
{
return
putFullDoc
(
jio
,
"
doc2
"
,
{
title
:
"
foo1
"
},
"
data
"
,
blobs2
[
0
]);
})
.
push
(
function
()
{
return
putFullDoc
(
jio
,
"
doc
"
,
{
title
:
"
bar2
"
},
"
data
"
,
blobs1
[
3
]);
})
.
push
(
function
()
{
return
putFullDoc
(
jio
,
"
doc
"
,
{
title
:
"
bar3
"
},
"
data
"
,
blobs1
[
4
]);
})
// Get timestamps
.
push
(
function
()
{
return
not_history
.
allDocs
({
sort_on
:
[[
"
timestamp
"
,
"
ascending
"
]]
});
})
.
push
(
function
(
results
)
{
timestamps
=
results
.
data
.
rows
.
map
(
function
(
d
)
{
return
d
.
id
;
});
})
.
push
(
function
()
{
return
jio
.
allDocs
({
select_list
:
[
"
title
"
],
include_revisions
:
true
});
})
.
push
(
function
(
results
)
{
deepEqual
(
results
.
data
.
rows
,
[
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar3
"
},
timestamp
:
timestamps
[
13
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar3
"
},
timestamp
:
timestamps
[
12
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar2
"
},
timestamp
:
timestamps
[
11
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar2
"
},
timestamp
:
timestamps
[
10
]
},
{
doc
:
{},
id
:
"
doc2
"
,
value
:
{
title
:
"
foo1
"
},
timestamp
:
timestamps
[
9
]
},
{
doc
:
{},
id
:
"
doc2
"
,
value
:
{
title
:
"
foo1
"
},
timestamp
:
timestamps
[
8
]
},
{
doc
:
{},
id
:
"
doc2
"
,
value
:
{
title
:
"
foo0
"
},
timestamp
:
timestamps
[
7
]
},
{
doc
:
{},
id
:
"
doc2
"
,
value
:
{
title
:
"
foo0
"
},
timestamp
:
timestamps
[
6
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar1
"
},
timestamp
:
timestamps
[
5
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar1
"
},
timestamp
:
timestamps
[
4
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar0
"
},
timestamp
:
timestamps
[
3
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar0
"
},
timestamp
:
timestamps
[
2
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar
"
},
timestamp
:
timestamps
[
1
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar
"
},
timestamp
:
timestamps
[
0
]
}
],
"
allDocs with include_revisions should return all revisions
"
);
})
.
fail
(
function
(
error
)
{
//console.log(error);
ok
(
false
,
error
);
})
.
always
(
function
()
{
start
();
});
});
test
(
"
Retrieving history with attachments with less straightforward ordering
"
,
function
()
{
stop
();
expect
(
1
);
var
jio
=
this
.
jio
,
not_history
=
this
.
not_history
,
timestamps
,
blobs1
=
[
new
Blob
([
'
a
'
]),
new
Blob
([
'
ab
'
]),
new
Blob
([
'
abc
'
]),
new
Blob
([
'
abcd
'
]),
new
Blob
([
'
abcde
'
])
];
jio
.
put
(
"
doc
"
,
{
title
:
"
bar
"
})
.
push
(
function
()
{
return
jio
.
put
(
"
doc
"
,
{
title
:
"
bar0
"
});
})
.
push
(
function
()
{
return
jio
.
putAttachment
(
"
doc
"
,
"
data
"
,
blobs1
[
0
]);
})
.
push
(
function
()
{
return
jio
.
put
(
"
doc2
"
,
{
title
:
"
foo0
"
});
})
.
push
(
function
()
{
return
jio
.
putAttachment
(
"
doc
"
,
"
data
"
,
blobs1
[
1
]);
})
// Get timestamps
.
push
(
function
()
{
return
not_history
.
allDocs
({
sort_on
:
[[
"
timestamp
"
,
"
ascending
"
]]
});
})
.
push
(
function
(
results
)
{
timestamps
=
results
.
data
.
rows
.
map
(
function
(
d
)
{
return
d
.
id
;
});
})
.
push
(
function
()
{
return
jio
.
allDocs
({
select_list
:
[
"
title
"
],
include_revisions
:
true
});
})
.
push
(
function
(
results
)
{
deepEqual
(
results
.
data
.
rows
,
[
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar0
"
},
timestamp
:
timestamps
[
4
]
},
{
doc
:
{},
id
:
"
doc2
"
,
value
:
{
title
:
"
foo0
"
},
timestamp
:
timestamps
[
3
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar0
"
},
timestamp
:
timestamps
[
2
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar0
"
},
timestamp
:
timestamps
[
1
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar
"
},
timestamp
:
timestamps
[
0
]
}
],
"
allDocs with include_revisions should return all revisions
"
);
})
.
fail
(
function
(
error
)
{
//console.log(error);
ok
(
false
,
error
);
})
.
always
(
function
()
{
start
();
});
});
test
(
"
Retrieving history with attachments with removals
"
,
function
()
{
stop
();
expect
(
2
);
var
jio
=
this
.
jio
,
not_history
=
this
.
not_history
,
timestamps
,
blobs1
=
[
new
Blob
([
'
a
'
]),
new
Blob
([
'
ab
'
]),
new
Blob
([
'
abc
'
]),
new
Blob
([
'
abcd
'
]),
new
Blob
([
'
abcde
'
])
];
jio
.
put
(
"
doc
"
,
{
title
:
"
bar
"
})
.
push
(
function
()
{
return
jio
.
put
(
"
doc
"
,
{
title
:
"
bar0
"
});
})
.
push
(
function
()
{
return
jio
.
putAttachment
(
"
doc
"
,
"
data
"
,
blobs1
[
0
]);
})
.
push
(
function
()
{
return
jio
.
put
(
"
doc2
"
,
{
title
:
"
foo0
"
});
})
.
push
(
function
()
{
return
jio
.
putAttachment
(
"
doc
"
,
"
data
"
,
blobs1
[
1
]);
})
// Get timestamps
.
push
(
function
()
{
return
not_history
.
allDocs
({
sort_on
:
[[
"
timestamp
"
,
"
ascending
"
]]
});
})
.
push
(
function
(
results
)
{
timestamps
=
results
.
data
.
rows
.
map
(
function
(
d
)
{
return
d
.
id
;
});
})
.
push
(
function
()
{
return
jio
.
allDocs
({
select_list
:
[
"
title
"
],
include_revisions
:
false
});
})
.
push
(
function
(
results
)
{
deepEqual
(
results
.
data
.
rows
,
[
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar0
"
},
timestamp
:
timestamps
[
4
]
},
{
doc
:
{},
id
:
"
doc2
"
,
value
:
{
title
:
"
foo0
"
},
timestamp
:
timestamps
[
3
]
}
],
"
allDocs with include_revisions false should return all revisions
"
);
})
.
push
(
function
()
{
return
jio
.
allDocs
({
select_list
:
[
"
title
"
],
include_revisions
:
true
});
})
.
push
(
function
(
results
)
{
deepEqual
(
results
.
data
.
rows
,
[
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar0
"
},
timestamp
:
timestamps
[
4
]
},
{
doc
:
{},
id
:
"
doc2
"
,
value
:
{
title
:
"
foo0
"
},
timestamp
:
timestamps
[
3
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar0
"
},
timestamp
:
timestamps
[
2
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar0
"
},
timestamp
:
timestamps
[
1
]
},
{
doc
:
{},
id
:
"
doc
"
,
value
:
{
title
:
"
bar
"
},
timestamp
:
timestamps
[
0
]
}
],
"
allDocs with include_revisions true should return all revisions
"
);
})
.
fail
(
function
(
error
)
{
//console.log(error);
ok
(
false
,
error
);
})
.
always
(
function
()
{
start
();
});
});
}(
jIO
,
RSVP
,
Blob
,
QUnit
));
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment