Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
jio
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
18
Merge Requests
18
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
nexedi
jio
Commits
93962ffc
Commit
93962ffc
authored
Jan 03, 2014
by
Tristan Cavelier
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'async-queries'
Conflicts: src/queries/begin.js
parents
c03b8cc5
bf46a5d5
Changes
8
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
519 additions
and
242 deletions
+519
-242
complex_queries.js
complex_queries.js
+190
-62
src/jio.storage/indexstorage.js
src/jio.storage/indexstorage.js
+23
-22
src/jio.storage/localstorage.js
src/jio.storage/localstorage.js
+21
-20
src/queries/core/complexquery.js
src/queries/core/complexquery.js
+73
-14
src/queries/core/query.js
src/queries/core/query.js
+57
-28
src/queries/core/simplequery.js
src/queries/core/simplequery.js
+17
-17
src/queries/core/tool.js
src/queries/core/tool.js
+41
-1
test/queries/tests.js
test/queries/tests.js
+97
-78
No files found.
complex_queries.js
View file @
93962ffc
This diff is collapsed.
Click to expand it.
src/jio.storage/indexstorage.js
View file @
93962ffc
...
@@ -719,28 +719,29 @@
...
@@ -719,28 +719,29 @@
}
}
}
}
complex_queries
.
QueryFactory
.
create
(
option
.
query
||
''
).
complex_queries
.
QueryFactory
.
create
(
option
.
query
||
''
).
exec
(
db
,
option
);
exec
(
db
,
option
).
then
(
function
()
{
for
(
i
=
0
;
i
<
db
.
length
;
i
+=
1
)
{
for
(
i
=
0
;
i
<
db
.
length
;
i
+=
1
)
{
id
=
db
[
i
].
_id
;
id
=
db
[
i
].
_id
;
if
(
delete_id
)
{
if
(
delete_id
)
{
delete
db
[
i
].
_id
;
delete
db
[
i
].
_id
;
}
}
if
(
option
.
include_docs
)
{
if
(
option
.
include_docs
)
{
db
[
i
]
=
{
db
[
i
]
=
{
"
id
"
:
id
,
"
id
"
:
id
,
"
value
"
:
db
[
i
],
"
value
"
:
db
[
i
],
"
doc
"
:
db
[
i
][
"
_
"
+
now
]
"
doc
"
:
db
[
i
][
"
_
"
+
now
]
};
};
delete
db
[
i
].
doc
[
"
_
"
+
now
];
delete
db
[
i
].
doc
[
"
_
"
+
now
];
delete
db
[
i
].
value
[
"
_
"
+
now
];
delete
db
[
i
].
value
[
"
_
"
+
now
];
}
else
{
}
else
{
db
[
i
]
=
{
db
[
i
]
=
{
"
id
"
:
id
,
"
id
"
:
id
,
"
value
"
:
db
[
i
]
"
value
"
:
db
[
i
]
};
};
}
}
}
}
command
.
success
(
200
,
{
"
data
"
:
{
"
total_rows
"
:
db
.
length
,
"
rows
"
:
db
}});
command
.
success
(
200
,
{
"
data
"
:
{
"
total_rows
"
:
db
.
length
,
"
rows
"
:
db
}});
});
},
function
(
err
)
{
},
function
(
err
)
{
if
(
err
.
status
===
404
)
{
if
(
err
.
status
===
404
)
{
return
command
.
success
(
200
,
{
"
data
"
:
{
"
total_rows
"
:
0
,
"
rows
"
:
[]}});
return
command
.
success
(
200
,
{
"
data
"
:
{
"
total_rows
"
:
0
,
"
rows
"
:
[]}});
...
...
src/jio.storage/localstorage.js
View file @
93962ffc
...
@@ -446,26 +446,27 @@
...
@@ -446,26 +446,27 @@
});
});
}
}
complex_queries
.
QueryFactory
.
create
(
options
.
query
||
""
).
complex_queries
.
QueryFactory
.
create
(
options
.
query
||
""
).
exec
(
document_list
,
options
);
exec
(
document_list
,
options
).
then
(
function
()
{
document_list
=
document_list
.
map
(
function
(
value
)
{
document_list
=
document_list
.
map
(
function
(
value
)
{
var
o
=
{
var
o
=
{
"
id
"
:
value
.
_id
,
"
id
"
:
value
.
_id
,
"
key
"
:
value
.
_id
"
key
"
:
value
.
_id
};
};
if
(
options
.
include_docs
===
true
)
{
if
(
options
.
include_docs
===
true
)
{
o
.
doc
=
document_object
[
value
.
_id
];
o
.
doc
=
document_object
[
value
.
_id
];
delete
document_object
[
value
.
_id
];
delete
document_object
[
value
.
_id
];
}
}
if
(
delete_id
)
{
if
(
delete_id
)
{
delete
value
.
_id
;
delete
value
.
_id
;
}
}
o
.
value
=
value
;
o
.
value
=
value
;
return
o
;
return
o
;
});
});
command
.
success
({
"
data
"
:
{
command
.
success
({
"
data
"
:
{
"
total_rows
"
:
document_list
.
length
,
"
total_rows
"
:
document_list
.
length
,
"
rows
"
:
document_list
"
rows
"
:
document_list
}});
}});
});
}
}
};
};
...
...
src/queries/core/complexquery.js
View file @
93962ffc
/*jslint indent: 2, maxlen: 80, sloppy: true, nomen: true */
/*jslint indent: 2, maxlen: 80, sloppy: true, nomen: true */
/*global Query: true, query_class_dict: true, inherits: true,
/*global Query: true, query_class_dict: true, inherits: true,
_export
: true, QueryFactory: tru
e */
_export
, QueryFactory, RSVP, sequenc
e */
/**
/**
* The ComplexQuery inherits from Query, and compares one or several metadata
* The ComplexQuery inherits from Query, and compares one or several metadata
...
@@ -56,8 +56,7 @@ ComplexQuery.prototype.toString = function () {
...
@@ -56,8 +56,7 @@ ComplexQuery.prototype.toString = function () {
str_list
.
push
(
query
.
toString
());
str_list
.
push
(
query
.
toString
());
str_list
.
push
(
this_operator
);
str_list
.
push
(
this_operator
);
});
});
str_list
.
pop
();
// remove last operator
str_list
[
str_list
.
length
-
1
]
=
"
)
"
;
// replace last operator
str_list
.
push
(
"
)
"
);
return
str_list
.
join
(
"
"
);
return
str_list
.
join
(
"
"
);
};
};
...
@@ -86,13 +85,41 @@ ComplexQuery.prototype.serialized = function () {
...
@@ -86,13 +85,41 @@ ComplexQuery.prototype.serialized = function () {
* @return {Boolean} true if all match, false otherwise
* @return {Boolean} true if all match, false otherwise
*/
*/
ComplexQuery
.
prototype
.
AND
=
function
(
item
,
wildcard_character
)
{
ComplexQuery
.
prototype
.
AND
=
function
(
item
,
wildcard_character
)
{
var
i
;
var
j
,
promises
=
[];
for
(
i
=
0
;
i
<
this
.
query_list
.
length
;
i
+=
1
)
{
for
(
j
=
0
;
j
<
this
.
query_list
.
length
;
j
+=
1
)
{
if
(
!
this
.
query_list
[
i
].
match
(
item
,
wildcard_character
))
{
promises
.
push
(
this
.
query_list
[
j
].
match
(
item
,
wildcard_character
));
return
false
;
}
function
cancel
()
{
var
i
;
for
(
i
=
0
;
i
<
promises
.
length
;
i
+=
1
)
{
if
(
typeof
promises
.
cancel
===
'
function
'
)
{
promises
.
cancel
();
}
}
}
}
}
return
true
;
return
new
RSVP
.
Promise
(
function
(
resolve
,
reject
)
{
var
i
,
count
=
0
;
function
resolver
(
value
)
{
if
(
!
value
)
{
resolve
(
false
);
}
count
+=
1
;
if
(
count
===
promises
.
length
)
{
resolve
(
true
);
}
}
function
rejecter
(
err
)
{
reject
(
err
);
cancel
();
}
for
(
i
=
0
;
i
<
promises
.
length
;
i
+=
1
)
{
promises
[
i
].
then
(
resolver
,
rejecter
);
}
},
cancel
);
};
};
/**
/**
...
@@ -105,13 +132,41 @@ ComplexQuery.prototype.AND = function (item, wildcard_character) {
...
@@ -105,13 +132,41 @@ ComplexQuery.prototype.AND = function (item, wildcard_character) {
* @return {Boolean} true if one match, false otherwise
* @return {Boolean} true if one match, false otherwise
*/
*/
ComplexQuery
.
prototype
.
OR
=
function
(
item
,
wildcard_character
)
{
ComplexQuery
.
prototype
.
OR
=
function
(
item
,
wildcard_character
)
{
var
i
;
var
j
,
promises
=
[];
for
(
i
=
0
;
i
<
this
.
query_list
.
length
;
i
+=
1
)
{
for
(
j
=
0
;
j
<
this
.
query_list
.
length
;
j
+=
1
)
{
if
(
this
.
query_list
[
i
].
match
(
item
,
wildcard_character
))
{
promises
.
push
(
this
.
query_list
[
j
].
match
(
item
,
wildcard_character
));
return
true
;
}
function
cancel
()
{
var
i
;
for
(
i
=
0
;
i
<
promises
.
length
;
i
+=
1
)
{
if
(
typeof
promises
.
cancel
===
'
function
'
)
{
promises
.
cancel
();
}
}
}
}
}
return
false
;
return
new
RSVP
.
Promise
(
function
(
resolve
,
reject
)
{
var
i
,
count
=
0
;
function
resolver
(
value
)
{
if
(
value
)
{
resolve
(
true
);
}
count
+=
1
;
if
(
count
===
promises
.
length
)
{
resolve
(
false
);
}
}
function
rejecter
(
err
)
{
reject
(
err
);
cancel
();
}
for
(
i
=
0
;
i
<
promises
.
length
;
i
+=
1
)
{
promises
[
i
].
then
(
resolver
,
rejecter
);
}
},
cancel
);
};
};
/**
/**
...
@@ -124,7 +179,11 @@ ComplexQuery.prototype.OR = function (item, wildcard_character) {
...
@@ -124,7 +179,11 @@ ComplexQuery.prototype.OR = function (item, wildcard_character) {
* @return {Boolean} true if one match, false otherwise
* @return {Boolean} true if one match, false otherwise
*/
*/
ComplexQuery
.
prototype
.
NOT
=
function
(
item
,
wildcard_character
)
{
ComplexQuery
.
prototype
.
NOT
=
function
(
item
,
wildcard_character
)
{
return
!
this
.
query_list
[
0
].
match
(
item
,
wildcard_character
);
return
sequence
([
function
()
{
return
this
.
query_list
[
0
].
match
(
item
,
wildcard_character
);
},
function
(
answer
)
{
return
!
answer
;
}]);
};
};
query_class_dict
.
complex
=
ComplexQuery
;
query_class_dict
.
complex
=
ComplexQuery
;
...
...
src/queries/core/query.js
View file @
93962ffc
/*jslint indent: 2, maxlen: 80, sloppy: true, nomen: true */
/*jslint indent: 2, maxlen: 80, sloppy: true, nomen: true */
/*global parseStringToObject: true, emptyFunction: true, sortOn: true, limit:
/*global parseStringToObject: true, emptyFunction: true, sortOn: true, limit:
true, select: true, _export: true, stringEscapeRegexpCharacters: true,
true, select: true, _export: true, stringEscapeRegexpCharacters: true,
deepClone
: tru
e */
deepClone
, RSVP, sequenc
e */
/**
/**
* The query to use to filter a list of objects.
* The query to use to filter a list of objects.
...
@@ -64,7 +64,7 @@ function Query() {
...
@@ -64,7 +64,7 @@ function Query() {
* second is the length.
* second is the length.
*/
*/
Query
.
prototype
.
exec
=
function
(
item_list
,
option
)
{
Query
.
prototype
.
exec
=
function
(
item_list
,
option
)
{
var
i
=
0
;
var
i
,
promises
=
[]
;
if
(
!
Array
.
isArray
(
item_list
))
{
if
(
!
Array
.
isArray
(
item_list
))
{
throw
new
TypeError
(
"
Query().exec(): Argument 1 is not of type 'array'
"
);
throw
new
TypeError
(
"
Query().exec(): Argument 1 is not of type 'array'
"
);
}
}
...
@@ -78,20 +78,34 @@ Query.prototype.exec = function (item_list, option) {
...
@@ -78,20 +78,34 @@ Query.prototype.exec = function (item_list, option) {
if
(
option
.
wildcard_character
===
undefined
)
{
if
(
option
.
wildcard_character
===
undefined
)
{
option
.
wildcard_character
=
'
%
'
;
option
.
wildcard_character
=
'
%
'
;
}
}
while
(
i
<
item_list
.
length
)
{
for
(
i
=
0
;
i
<
item_list
.
length
;
i
+=
1
)
{
if
(
!
item_list
[
i
]
||
!
this
.
match
(
item_list
[
i
],
option
.
wildcard_character
)
)
{
if
(
!
item_list
[
i
])
{
item_list
.
splice
(
i
,
1
);
promises
.
push
(
RSVP
.
resolve
(
false
)
);
}
else
{
}
else
{
i
+=
1
;
promises
.
push
(
this
.
match
(
item_list
[
i
],
option
.
wildcard_character
))
;
}
}
}
}
if
(
option
.
sort_on
)
{
return
sequence
([
function
()
{
sortOn
(
option
.
sort_on
,
item_list
);
return
RSVP
.
all
(
promises
);
}
},
function
(
answers
)
{
if
(
option
.
limit
)
{
var
j
;
limit
(
option
.
limit
,
item_list
);
for
(
j
=
answers
.
length
-
1
;
j
>=
0
;
j
-=
1
)
{
}
if
(
!
answers
[
j
])
{
select
(
option
.
select_list
||
[],
item_list
);
item_list
.
splice
(
j
,
1
);
}
}
if
(
option
.
sort_on
)
{
return
sortOn
(
option
.
sort_on
,
item_list
);
}
},
function
()
{
if
(
option
.
limit
)
{
return
limit
(
option
.
limit
,
item_list
);
}
},
function
()
{
return
select
(
option
.
select_list
||
[],
item_list
);
},
function
()
{
return
item_list
;
}]);
};
};
/**
/**
...
@@ -103,7 +117,7 @@ Query.prototype.exec = function (item_list, option) {
...
@@ -103,7 +117,7 @@ Query.prototype.exec = function (item_list, option) {
* @return {Boolean} true if match, false otherwise
* @return {Boolean} true if match, false otherwise
*/
*/
Query
.
prototype
.
match
=
function
()
{
Query
.
prototype
.
match
=
function
()
{
return
true
;
return
RSVP
.
resolve
(
true
)
;
};
};
...
@@ -129,24 +143,39 @@ Query.prototype.parse = function (option) {
...
@@ -129,24 +143,39 @@ Query.prototype.parse = function (option) {
* @return {Any} The parser result
* @return {Any} The parser result
*/
*/
function
recParse
(
object
,
option
)
{
function
recParse
(
object
,
option
)
{
var
i
,
query
=
object
.
parsed
;
var
query
=
object
.
parsed
;
if
(
query
.
type
===
"
complex
"
)
{
if
(
query
.
type
===
"
complex
"
)
{
for
(
i
=
0
;
i
<
query
.
query_list
.
length
;
i
+=
1
)
{
return
sequence
([
function
()
{
object
.
parsed
=
query
.
query_list
[
i
];
return
sequence
(
query
.
query_list
.
map
(
function
(
v
,
i
)
{
recParse
(
object
,
option
);
/*jslint unparam: true */
query
.
query_list
[
i
]
=
object
.
parsed
;
return
function
()
{
}
sequence
([
function
()
{
object
.
parsed
=
query
;
object
.
parsed
=
query
.
query_list
[
i
];
that
.
onParseComplexQuery
(
object
,
option
);
return
recParse
(
object
,
option
);
}
else
if
(
query
.
type
===
"
simple
"
)
{
},
function
()
{
that
.
onParseSimpleQuery
(
object
,
option
);
query
.
query_list
[
i
]
=
object
.
parsed
;
}]);
};
}));
},
function
()
{
object
.
parsed
=
query
;
return
that
.
onParseComplexQuery
(
object
,
option
);
}]);
}
if
(
query
.
type
===
"
simple
"
)
{
return
that
.
onParseSimpleQuery
(
object
,
option
);
}
}
}
}
object
=
{
"
parsed
"
:
JSON
.
parse
(
JSON
.
stringify
(
that
.
serialized
()))};
object
=
{
"
parsed
"
:
JSON
.
parse
(
JSON
.
stringify
(
that
.
serialized
()))};
that
.
onParseStart
(
object
,
option
);
return
sequence
([
function
()
{
recParse
(
object
,
option
);
return
that
.
onParseStart
(
object
,
option
);
that
.
onParseEnd
(
object
,
option
);
},
function
()
{
return
object
.
parsed
;
return
recParse
(
object
,
option
);
},
function
()
{
return
that
.
onParseEnd
(
object
,
option
);
},
function
()
{
return
object
.
parsed
;
}]);
};
};
/**
/**
...
...
src/queries/core/simplequery.js
View file @
93962ffc
/*jslint indent: 2, maxlen: 80, sloppy: true, nomen: true */
/*jslint indent: 2, maxlen: 80, sloppy: true, nomen: true */
/*global Query: true, inherits: true, query_class_dict: true, _export: true,
/*global Query: true, inherits: true, query_class_dict: true, _export: true,
convertStringToRegExp
: true
*/
convertStringToRegExp
, RSVP
*/
/**
/**
* The SimpleQuery inherits from Query, and compares one metadata value
* The SimpleQuery inherits from Query, and compares one metadata value
...
@@ -81,7 +81,7 @@ SimpleQuery.prototype.serialized = function () {
...
@@ -81,7 +81,7 @@ SimpleQuery.prototype.serialized = function () {
* @return {Boolean} true if match, false otherwise
* @return {Boolean} true if match, false otherwise
*/
*/
SimpleQuery
.
prototype
[
"
=
"
]
=
function
(
object_value
,
comparison_value
,
SimpleQuery
.
prototype
[
"
=
"
]
=
function
(
object_value
,
comparison_value
,
wildcard_character
)
{
wildcard_character
)
{
var
value
,
i
;
var
value
,
i
;
if
(
!
Array
.
isArray
(
object_value
))
{
if
(
!
Array
.
isArray
(
object_value
))
{
object_value
=
[
object_value
];
object_value
=
[
object_value
];
...
@@ -93,12 +93,12 @@ SimpleQuery.prototype["="] = function (object_value, comparison_value,
...
@@ -93,12 +93,12 @@ SimpleQuery.prototype["="] = function (object_value, comparison_value,
}
}
if
(
comparison_value
===
undefined
)
{
if
(
comparison_value
===
undefined
)
{
if
(
value
===
undefined
)
{
if
(
value
===
undefined
)
{
return
true
;
return
RSVP
.
resolve
(
true
)
;
}
}
return
false
;
return
RSVP
.
resolve
(
false
)
;
}
}
if
(
value
===
undefined
)
{
if
(
value
===
undefined
)
{
return
false
;
return
RSVP
.
resolve
(
false
)
;
}
}
if
(
if
(
convertStringToRegExp
(
convertStringToRegExp
(
...
@@ -106,10 +106,10 @@ SimpleQuery.prototype["="] = function (object_value, comparison_value,
...
@@ -106,10 +106,10 @@ SimpleQuery.prototype["="] = function (object_value, comparison_value,
wildcard_character
wildcard_character
).
test
(
value
.
toString
())
).
test
(
value
.
toString
())
)
{
)
{
return
true
;
return
RSVP
.
resolve
(
true
)
;
}
}
}
}
return
false
;
return
RSVP
.
resolve
(
false
)
;
};
};
/**
/**
...
@@ -122,7 +122,7 @@ SimpleQuery.prototype["="] = function (object_value, comparison_value,
...
@@ -122,7 +122,7 @@ SimpleQuery.prototype["="] = function (object_value, comparison_value,
* @return {Boolean} true if not match, false otherwise
* @return {Boolean} true if not match, false otherwise
*/
*/
SimpleQuery
.
prototype
[
"
!=
"
]
=
function
(
object_value
,
comparison_value
,
SimpleQuery
.
prototype
[
"
!=
"
]
=
function
(
object_value
,
comparison_value
,
wildcard_character
)
{
wildcard_character
)
{
var
value
,
i
;
var
value
,
i
;
if
(
!
Array
.
isArray
(
object_value
))
{
if
(
!
Array
.
isArray
(
object_value
))
{
object_value
=
[
object_value
];
object_value
=
[
object_value
];
...
@@ -134,12 +134,12 @@ SimpleQuery.prototype["!="] = function (object_value, comparison_value,
...
@@ -134,12 +134,12 @@ SimpleQuery.prototype["!="] = function (object_value, comparison_value,
}
}
if
(
comparison_value
===
undefined
)
{
if
(
comparison_value
===
undefined
)
{
if
(
value
===
undefined
)
{
if
(
value
===
undefined
)
{
return
false
;
return
RSVP
.
resolve
(
false
)
;
}
}
return
true
;
return
RSVP
.
resolve
(
true
)
;
}
}
if
(
value
===
undefined
)
{
if
(
value
===
undefined
)
{
return
true
;
return
RSVP
.
resolve
(
true
)
;
}
}
if
(
if
(
convertStringToRegExp
(
convertStringToRegExp
(
...
@@ -147,10 +147,10 @@ SimpleQuery.prototype["!="] = function (object_value, comparison_value,
...
@@ -147,10 +147,10 @@ SimpleQuery.prototype["!="] = function (object_value, comparison_value,
wildcard_character
wildcard_character
).
test
(
value
.
toString
())
).
test
(
value
.
toString
())
)
{
)
{
return
false
;
return
RSVP
.
resolve
(
false
)
;
}
}
}
}
return
true
;
return
RSVP
.
resolve
(
true
)
;
};
};
/**
/**
...
@@ -170,7 +170,7 @@ SimpleQuery.prototype["<"] = function (object_value, comparison_value) {
...
@@ -170,7 +170,7 @@ SimpleQuery.prototype["<"] = function (object_value, comparison_value) {
if
(
typeof
value
===
'
object
'
)
{
if
(
typeof
value
===
'
object
'
)
{
value
=
value
.
content
;
value
=
value
.
content
;
}
}
return
value
<
comparison_value
;
return
RSVP
.
resolve
(
value
<
comparison_value
)
;
};
};
/**
/**
...
@@ -191,7 +191,7 @@ SimpleQuery.prototype["<="] = function (object_value, comparison_value) {
...
@@ -191,7 +191,7 @@ SimpleQuery.prototype["<="] = function (object_value, comparison_value) {
if
(
typeof
value
===
'
object
'
)
{
if
(
typeof
value
===
'
object
'
)
{
value
=
value
.
content
;
value
=
value
.
content
;
}
}
return
value
<=
comparison_value
;
return
RSVP
.
resolve
(
value
<=
comparison_value
)
;
};
};
/**
/**
...
@@ -212,7 +212,7 @@ SimpleQuery.prototype[">"] = function (object_value, comparison_value) {
...
@@ -212,7 +212,7 @@ SimpleQuery.prototype[">"] = function (object_value, comparison_value) {
if
(
typeof
value
===
'
object
'
)
{
if
(
typeof
value
===
'
object
'
)
{
value
=
value
.
content
;
value
=
value
.
content
;
}
}
return
value
>
comparison_value
;
return
RSVP
.
resolve
(
value
>
comparison_value
)
;
};
};
/**
/**
...
@@ -233,7 +233,7 @@ SimpleQuery.prototype[">="] = function (object_value, comparison_value) {
...
@@ -233,7 +233,7 @@ SimpleQuery.prototype[">="] = function (object_value, comparison_value) {
if
(
typeof
value
===
'
object
'
)
{
if
(
typeof
value
===
'
object
'
)
{
value
=
value
.
content
;
value
=
value
.
content
;
}
}
return
value
>=
comparison_value
;
return
RSVP
.
resolve
(
value
>=
comparison_value
)
;
};
};
query_class_dict
.
simple
=
SimpleQuery
;
query_class_dict
.
simple
=
SimpleQuery
;
...
...
src/queries/core/tool.js
View file @
93962ffc
/*jslint indent: 2, maxlen: 80, sloppy: true, nomen: true */
/*jslint indent: 2, maxlen: 80, sloppy: true, nomen: true */
/*global _export
: true
*/
/*global _export
, RSVP
*/
/**
/**
* Escapes regexp special chars from a string.
* Escapes regexp special chars from a string.
...
@@ -287,3 +287,43 @@ function convertStringToRegExp(string, wildcard_character) {
...
@@ -287,3 +287,43 @@ function convertStringToRegExp(string, wildcard_character) {
}
}
_export
(
'
convertStringToRegExp
'
,
convertStringToRegExp
);
_export
(
'
convertStringToRegExp
'
,
convertStringToRegExp
);
/**
* sequence(thens): Promise
*
* Executes a sequence of *then* callbacks. It acts like
* `smth().then(callback).then(callback)...`. The first callback is called with
* no parameter.
*
* Elements of `thens` array can be a function or an array contaning at most
* three *then* callbacks: *onFulfilled*, *onRejected*, *onNotified*.
*
* When `cancel()` is executed, each then promises are cancelled at the same
* time.
*
* @param {Array} thens An array of *then* callbacks
* @return {Promise} A new promise
*/
function
sequence
(
thens
)
{
var
promises
=
[];
return
new
RSVP
.
Promise
(
function
(
resolve
,
reject
,
notify
)
{
var
i
;
promises
[
0
]
=
new
RSVP
.
Promise
(
function
(
resolve
)
{
resolve
();
});
for
(
i
=
0
;
i
<
thens
.
length
;
i
+=
1
)
{
if
(
Array
.
isArray
(
thens
[
i
]))
{
promises
[
i
+
1
]
=
promises
[
i
].
then
(
thens
[
i
][
0
],
thens
[
i
][
1
],
thens
[
i
][
2
]);
}
else
{
promises
[
i
+
1
]
=
promises
[
i
].
then
(
thens
[
i
]);
}
}
promises
[
i
].
then
(
resolve
,
reject
,
notify
);
},
function
()
{
var
i
;
for
(
i
=
0
;
i
<
promises
.
length
;
i
+=
1
)
{
promises
[
i
].
cancel
();
}
});
}
test/queries/tests.js
View file @
93962ffc
/*jslint indent: 2, maxlen: 80, nomen: true */
/*jslint indent: 2, maxlen: 80, nomen: true */
/*global define, exports, require, module, complex_queries, window, test, ok,
/*global define, exports, require, module, complex_queries, window, test, ok,
deepEqual, s
inon
*/
deepEqual, s
top, start
*/
// define([module_name], [dependencies], module);
// define([module_name], [dependencies], module);
(
function
(
dependencies
,
module
)
{
(
function
(
dependencies
,
module
)
{
...
@@ -23,11 +23,14 @@
...
@@ -23,11 +23,14 @@
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
[
"
b
"
,
"
c
"
]}
{
"
identifier
"
:
[
"
b
"
,
"
c
"
]}
];
];
complex_queries
.
QueryFactory
.
create
(
''
).
exec
(
doc_list
);
stop
();
deepEqual
(
doc_list
,
[
complex_queries
.
QueryFactory
.
create
(
''
).
exec
(
doc_list
).
{
"
identifier
"
:
"
a
"
},
then
(
function
(
doc_list
)
{
{
"
identifier
"
:
[
"
b
"
,
"
c
"
]}
deepEqual
(
doc_list
,
[
],
'
Nothing done on the list
'
);
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
[
"
b
"
,
"
c
"
]}
],
'
Nothing done on the list
'
);
}).
always
(
start
);
});
});
test
(
'
Simple Query
'
,
function
()
{
test
(
'
Simple Query
'
,
function
()
{
...
@@ -35,20 +38,26 @@
...
@@ -35,20 +38,26 @@
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
[
"
b
"
,
"
c
"
]}
{
"
identifier
"
:
[
"
b
"
,
"
c
"
]}
];
];
complex_queries
.
QueryFactory
.
create
(
'
identifier: "a"
'
).
exec
(
doc_list
);
stop
();
deepEqual
(
doc_list
,
[
complex_queries
.
QueryFactory
.
create
(
'
identifier: "a"
'
).
exec
(
doc_list
).
{
"
identifier
"
:
"
a
"
}
then
(
function
(
doc_list
)
{
],
'
Document with several identifier should be removed
'
);
deepEqual
(
doc_list
,
[
{
"
identifier
"
:
"
a
"
}
],
'
Document with several identifier should be removed
'
);
doc_list
=
[
doc_list
=
[
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
[
"
a
"
,
"
b
"
]}
{
"
identifier
"
:
[
"
a
"
,
"
b
"
]}
];
];
complex_queries
.
QueryFactory
.
create
(
'
identifier: "a"
'
).
exec
(
doc_list
);
deepEqual
(
doc_list
,
[
return
complex_queries
.
QueryFactory
.
create
(
'
identifier: "a"
'
).
{
"
identifier
"
:
"
a
"
},
exec
(
doc_list
);
{
"
identifier
"
:
[
"
a
"
,
"
b
"
]}
}).
then
(
function
(
doc_list
)
{
],
'
Document with several identifier should be kept
'
);
deepEqual
(
doc_list
,
[
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
[
"
a
"
,
"
b
"
]}
],
'
Document with several identifier should be kept
'
);
}).
always
(
start
);
});
});
test
(
'
Complex Query
'
,
function
()
{
test
(
'
Complex Query
'
,
function
()
{
...
@@ -56,35 +65,40 @@
...
@@ -56,35 +65,40 @@
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
[
"
b
"
,
"
c
"
]}
{
"
identifier
"
:
[
"
b
"
,
"
c
"
]}
];
];
stop
();
complex_queries
.
QueryFactory
.
create
(
complex_queries
.
QueryFactory
.
create
(
'
identifier: "b" AND identifier: "c"
'
'
identifier: "b" AND identifier: "c"
'
).
exec
(
doc_list
)
;
).
exec
(
doc_list
)
.
then
(
function
(
doc_list
)
{
deepEqual
(
doc_list
,
[
deepEqual
(
doc_list
,
[
{
"
identifier
"
:
[
"
b
"
,
"
c
"
]}
{
"
identifier
"
:
[
"
b
"
,
"
c
"
]}
],
'
Document with only one identifier should be removed
'
);
],
'
Document with only one identifier should be removed
'
);
doc_list
=
[
doc_list
=
[
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
[
"
b
"
,
"
c
"
]}
{
"
identifier
"
:
[
"
b
"
,
"
c
"
]}
];
];
complex_queries
.
QueryFactory
.
create
(
return
complex_queries
.
QueryFactory
.
create
(
'
identifier: "a" OR identifier: "c"
'
'
identifier: "a" OR identifier: "c"
'
).
exec
(
doc_list
);
).
exec
(
doc_list
);
deepEqual
(
doc_list
,
[
}).
then
(
function
(
doc_list
)
{
{
"
identifier
"
:
"
a
"
},
deepEqual
(
doc_list
,
[
{
"
identifier
"
:
[
"
b
"
,
"
c
"
]}
{
"
identifier
"
:
"
a
"
},
],
'
All document matches
'
);
{
"
identifier
"
:
[
"
b
"
,
"
c
"
]}
],
'
All document matches
'
);
doc_list
=
[
doc_list
=
[
{
"
identifier
"
:
"
a
"
,
"
title
"
:
"
o
"
},
{
"
identifier
"
:
"
a
"
,
"
title
"
:
"
o
"
},
{
"
identifier
"
:
[
"
b
"
,
"
c
"
]}
{
"
identifier
"
:
[
"
b
"
,
"
c
"
]}
];
];
complex_queries
.
QueryFactory
.
create
(
'
(identifier: "a" OR identifier: "b") AND title: "o"
'
return
complex_queries
.
QueryFactory
.
create
(
).
exec
(
doc_list
);
'
(identifier: "a" OR identifier: "b") AND title: "o"
'
deepEqual
(
doc_list
,
[
).
exec
(
doc_list
);
{
"
identifier
"
:
"
a
"
,
"
title
"
:
"
o
"
}
}).
then
(
function
(
doc_list
)
{
],
'
Only first document should be kept
'
);
deepEqual
(
doc_list
,
[
{
"
identifier
"
:
"
a
"
,
"
title
"
:
"
o
"
}
],
'
Only first document should be kept
'
);
}).
always
(
start
);
});
});
test
(
'
Wildcard Character
'
,
function
()
{
test
(
'
Wildcard Character
'
,
function
()
{
...
@@ -93,40 +107,43 @@
...
@@ -93,40 +107,43 @@
{
"
identifier
"
:
"
a%
"
},
{
"
identifier
"
:
"
a%
"
},
{
"
identifier
"
:
[
"
ab
"
,
"
b
"
]}
{
"
identifier
"
:
[
"
ab
"
,
"
b
"
]}
];
];
stop
();
complex_queries
.
QueryFactory
.
create
(
'
identifier: "a%"
'
).
exec
(
doc_list
,
{
complex_queries
.
QueryFactory
.
create
(
'
identifier: "a%"
'
).
exec
(
doc_list
,
{
// "wildcard_character": "%" // default
// "wildcard_character": "%" // default
})
;
})
.
then
(
function
(
doc_list
)
{
deepEqual
(
doc_list
,
[
deepEqual
(
doc_list
,
[
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
"
a%
"
},
{
"
identifier
"
:
"
a%
"
},
{
"
identifier
"
:
[
"
ab
"
,
"
b
"
]}
{
"
identifier
"
:
[
"
ab
"
,
"
b
"
]}
],
'
All documents should be kept
'
);
],
'
All documents should be kept
'
);
doc_list
=
[
doc_list
=
[
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
"
a%
"
},
{
"
identifier
"
:
"
a%
"
},
{
"
identifier
"
:
[
"
ab
"
,
"
b
"
]}
{
"
identifier
"
:
[
"
ab
"
,
"
b
"
]}
];
];
complex_queries
.
QueryFactory
.
create
(
'
identifier: "a%"
'
).
exec
(
doc_list
,
{
"
wildcard_character
"
:
null
});
deepEqual
(
doc_list
,
[
{
"
identifier
"
:
"
a%
"
}
],
'
Document "a%" should be kept
'
);
doc_list
=
[
return
complex_queries
.
QueryFactory
.
create
(
'
identifier: "a%"
'
).
{
"
identifier
"
:
"
a
"
},
exec
(
doc_list
,
{
"
wildcard_character
"
:
null
});
{
"
identifier
"
:
"
a%
"
},
}).
then
(
function
(
doc_list
)
{
{
"
identifier
"
:
[
"
ab
"
,
"
b
"
]}
deepEqual
(
doc_list
,
[
];
{
"
identifier
"
:
"
a%
"
}
complex_queries
.
QueryFactory
.
create
(
'
identifier: "b"
'
).
exec
(
doc_list
,
{
],
'
Document "a%" should be kept
'
);
"
wildcard_character
"
:
"
b
"
});
doc_list
=
[
deepEqual
(
doc_list
,
[
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
"
a%
"
},
{
"
identifier
"
:
"
a%
"
},
{
"
identifier
"
:
[
"
ab
"
,
"
b
"
]}
{
"
identifier
"
:
[
"
ab
"
,
"
b
"
]}
];
],
'
All documents should be kept
'
);
return
complex_queries
.
QueryFactory
.
create
(
'
identifier: "b"
'
).
exec
(
doc_list
,
{
"
wildcard_character
"
:
"
b
"
});
}).
then
(
function
(
doc_list
)
{
deepEqual
(
doc_list
,
[
{
"
identifier
"
:
"
a
"
},
{
"
identifier
"
:
"
a%
"
},
{
"
identifier
"
:
[
"
ab
"
,
"
b
"
]}
],
'
All documents should be kept
'
);
}).
always
(
start
);
});
});
test
(
"
Additional Filters
"
,
function
()
{
test
(
"
Additional Filters
"
,
function
()
{
...
@@ -135,14 +152,16 @@
...
@@ -135,14 +152,16 @@
{
"
identifier
"
:
"
a
"
,
"
title
"
:
"
f
"
},
{
"
identifier
"
:
"
a
"
,
"
title
"
:
"
f
"
},
{
"
identifier
"
:
"
b
"
,
"
title
"
:
"
d
"
}
{
"
identifier
"
:
"
b
"
,
"
title
"
:
"
d
"
}
];
];
stop
();
complex_queries
.
QueryFactory
.
create
(
''
).
exec
(
doc_list
,
{
complex_queries
.
QueryFactory
.
create
(
''
).
exec
(
doc_list
,
{
"
select_list
"
:
[
"
title
"
],
"
select_list
"
:
[
"
title
"
],
"
limit
"
:
[
2
,
1
],
"
limit
"
:
[
2
,
1
],
"
sort_on
"
:
[[
"
identifier
"
,
"
ascending
"
],
[
"
title
"
,
"
descending
"
]]
"
sort_on
"
:
[[
"
identifier
"
,
"
ascending
"
],
[
"
title
"
,
"
descending
"
]]
});
}).
then
(
function
(
doc_list
)
{
deepEqual
(
doc_list
,
[
deepEqual
(
doc_list
,
[
{
"
title
"
:
"
d
"
}
{
"
title
"
:
"
d
"
}
],
'
The first document should be kept
'
);
],
'
The first document should be kept
'
);
}).
always
(
start
);
});
});
}));
}));
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