Commit 2d25d25c authored by Vincent Bechu's avatar Vincent Bechu

mappingstorage: fix post, add test, and change function names

parent c2ec00d9
......@@ -7,21 +7,25 @@
function MappingStorage(spec) {
this._mapping_dict = spec.mapping_dict || {};
this._sub_storage = jIO.createJIO(spec.sub_storage);
this._map_all_property = spec.map_all_property || false;
this._mapping_dict_attachment = spec.mapping_dict_attachment || {};
this._map_all_property = spec.map_all_property !== undefined ?
spec.map_all_property : true;
this._attachment_mapping_dict = spec.attachment_mapping_dict || {};
this._query = spec.query || {};
if (this._query.query !== undefined) {
this._query.query = QueryFactory.create(this._query.query);
}
this._default_mapping = {};
this._id_is_mapped = (this._mapping_dict.id !== undefined
&& this._mapping_dict.id.equal !== "id");
var property, query_list = [];
// handle default_value.
// handle default_value.
for (property in this._mapping_dict) {
if (this._mapping_dict.hasOwnProperty(property)) {
if (this._mapping_dict[property].default_value !== undefined) {
this._default_mapping[property] =
this._mapping_dict[property].default_value;
query_list.push(new SimpleQuery({
key: property,
value: this._mapping_dict[property].default_value,
......@@ -47,7 +51,7 @@
}
function getAttachmentId(storage, sub_id, attachment_id, method) {
var mapping_dict = storage._mapping_dict_attachment;
var mapping_dict = storage._attachment_mapping_dict;
return new RSVP.Queue()
.push(function () {
if (mapping_dict !== undefined
......@@ -106,13 +110,19 @@
});
}
function unmapProperty(storage, property, doc, mapped_doc) {
if (storage._mapping_dict[property].equal !== undefined) {
doc[storage._mapping_dict[property].equal] = mapped_doc[property];
return storage._mapping_dict[property].equal;
function mapToSubProperty(storage, property, sub_doc, doc) {
if (storage._mapping_dict[property] !== undefined) {
if (storage._mapping_dict[property].equal !== undefined) {
sub_doc[storage._mapping_dict[property].equal] = doc[property];
return storage._mapping_dict[property].equal;
}
if (storage._mapping_dict[property].default_value !== undefined) {
sub_doc[property] = storage._mapping_dict[property].default_value;
return property;
}
}
if (storage._mapping_dict[property].default_value !== undefined) {
doc[property] = storage._mapping_dict[property].default_value;
if (storage._map_all_property) {
sub_doc[property] = doc[property];
return property;
}
throw new jIO.util.jIOError(
......@@ -121,11 +131,11 @@
);
}
function mapProperty(storage, property, doc, mapped_doc) {
function mapToMainProperty(storage, property, sub_doc, doc) {
if (storage._mapping_dict[property] !== undefined) {
if (storage._mapping_dict[property].equal !== undefined) {
if (doc.hasOwnProperty(storage._mapping_dict[property].equal)) {
mapped_doc[property] = doc[storage._mapping_dict[property].equal];
if (sub_doc.hasOwnProperty(storage._mapping_dict[property].equal)) {
doc[property] = sub_doc[storage._mapping_dict[property].equal];
}
return storage._mapping_dict[property].equal;
}
......@@ -134,56 +144,53 @@
}
}
if (storage._map_all_property) {
if (doc.hasOwnProperty(property)) {
mapped_doc[property] = doc[property];
if (sub_doc.hasOwnProperty(property)) {
doc[property] = sub_doc[property];
}
return property;
}
return false;
}
function mapDocument(storage, doc, id_delete) {
var mapped_doc = {},
function mapToMainDocument(storage, sub_doc, delete_id_from_doc) {
var doc = {},
property,
property_list = [];
for (property in storage._mapping_dict) {
if (storage._mapping_dict.hasOwnProperty(property)) {
property_list.push(mapProperty(storage, property, doc, mapped_doc));
property_list.push(mapToMainProperty(storage, property, sub_doc, doc));
}
}
if (storage._map_all_property) {
for (property in doc) {
if (doc.hasOwnProperty(property)) {
for (property in sub_doc) {
if (sub_doc.hasOwnProperty(property)) {
if (property_list.indexOf(property) < 0) {
mapped_doc[property] = doc[property];
doc[property] = sub_doc[property];
}
}
}
}
if (id_delete) {
delete mapped_doc.id;
if (delete_id_from_doc) {
delete doc.id;
}
return mapped_doc;
return doc;
}
function unmapDocument(storage, mapped_doc) {
var doc = {}, property, property_list = [];
for (property in storage._mapping_dict) {
if (storage._mapping_dict.hasOwnProperty(property)) {
property_list.push(unmapProperty(storage, property, doc, mapped_doc));
function mapToSubstorageDocument(storage, doc) {
var sub_doc = {}, property;
for (property in doc) {
if (doc.hasOwnProperty(property)) {
mapToSubProperty(storage, property, sub_doc, doc);
}
}
if (storage._map_all_property) {
for (property in mapped_doc) {
if (mapped_doc.hasOwnProperty(property)) {
if (property_list.indexOf(property) < 0) {
doc[property] = mapped_doc[property];
}
}
for (property in storage._default_mapping) {
if (storage._default_mapping.hasOwnProperty(property)) {
sub_doc[property] = storage._default_mapping[property];
}
}
delete doc.id;
return doc;
delete sub_doc.id;
return sub_doc;
}
MappingStorage.prototype.get = function (id) {
......@@ -192,8 +199,8 @@
.push(function (sub_id) {
return context._sub_storage.get(sub_id);
})
.push(function (doc) {
return mapDocument(context, doc, true);
.push(function (sub_doc) {
return mapToMainDocument(context, sub_doc, true);
})
.push(undefined, function (error) {
throw new jIO.util.jIOError("Cannot find document " + id
......@@ -201,30 +208,31 @@
});
};
MappingStorage.prototype.post = function (doc_mapped) {
MappingStorage.prototype.post = function (doc) {
if (!this._id_is_mapped) {
return this._sub_storage.post.apply(
this._sub_storage,
unmapDocument(this, doc_mapped)
);
return this._sub_storage.post(mapToSubstorageDocument(this, doc));
}
throw new jIO.util.jIOError(
"post is not supported with id mapped",
400
);
};
MappingStorage.prototype.put = function (id, doc) {
var context = this,
mapped_doc = unmapDocument(this, doc);
sub_doc = mapToSubstorageDocument(this, doc);
return getSubStorageId(this, id)
.push(function (sub_id) {
if (context._id_is_mapped) {
mapped_doc[context._mapping_dict.id.equal] = id;
sub_doc[context._mapping_dict.id.equal] = id;
}
if (id === undefined) {
throw new Error();
}
return context._sub_storage.put(sub_id, mapped_doc);
return context._sub_storage.put(sub_id, sub_doc);
})
.push(undefined, function () {
return context._sub_storage.post(mapped_doc);
return context._sub_storage.post(sub_doc);
})
.push(function () {
return id;
......@@ -318,7 +326,7 @@
})
.push(function (result) {
for (i = 0; i < result.length; i += 1) {
mapped_result.push(mapDocument(context, result[i], false));
mapped_result.push(mapToMainDocument(context, result[i], false));
}
return mapped_result;
});
......@@ -341,13 +349,13 @@
one_query.query_list = query_list;
return one_query;
}
one_query.key = mapProperty(context, one_query.key, {}, {});
one_query.key = mapToMainProperty(context, one_query.key, {}, {});
return one_query;
}
if (option.sort_on !== undefined) {
for (i = 0; i < option.sort_on.length; i += 1) {
property = mapProperty(this, option.sort_on[i][0], {}, {});
property = mapToMainProperty(this, option.sort_on[i][0], {}, {});
if (property && sort_on.indexOf(property) < 0) {
select_list.push([property, option.sort_on[i][1]]);
}
......@@ -363,7 +371,7 @@
}
if (option.select_list !== undefined) {
for (i = 0; i < option.select_list.length; i += 1) {
property = mapProperty(this, option.select_list[i], {}, {});
property = mapToMainProperty(this, option.select_list[i], {}, {});
if (property && select_list.indexOf(property) < 0) {
select_list.push(property);
}
......@@ -409,7 +417,7 @@
.push(function (result) {
for (i = 0; i < result.data.total_rows; i += 1) {
result.data.rows[i].value =
mapDocument(context, result.data.rows[i].value, false);
mapToMainDocument(context, result.data.rows[i].value, false);
if (result.data.rows[i].id !== undefined && context._id_is_mapped) {
result.data.rows[i].id =
result.data.rows[i].value.id;
......
......@@ -37,7 +37,7 @@
deepEqual(jio.__storage._mapping_dict, {});
deepEqual(jio.__storage._mapping_dict_attachment, {});
deepEqual(jio.__storage._query, {});
equal(jio.__storage._map_all_property, false);
equal(jio.__storage._map_all_property, true);
});
test("accept parameters", function () {
......@@ -47,7 +47,7 @@
type: "mappingstorage2713"
},
mapping_dict: { "bar": {"equal": "foo"}},
map_all_property: true,
map_all_property: false,
query: {"query": 'foo: "bar"'},
mapping_dict_attachment: {"foo": {"get": "bar"}}
});
......@@ -57,7 +57,7 @@
equal(jio.__storage._query.query.value, "bar");
equal(jio.__storage._query.query.type, "simple");
deepEqual(jio.__storage._mapping_dict_attachment, {"foo": {"get": "bar"}});
equal(jio.__storage._map_all_property, true);
equal(jio.__storage._map_all_property, false);
});
/////////////////////////////////////////////////////////////////
......@@ -82,17 +82,15 @@
return {title: "foo"};
};
start();
jio.get("bar")
.then(function (result) {
.push(function (result) {
deepEqual(result, {
"title": "foo"
}, "Check document");
})
.fail(function (error) {
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -113,16 +111,14 @@
return {otherTitle: "foo"};
};
start();
jio.get("bar")
.then(function (result) {
.push(function (result) {
deepEqual(result, {
"title": "foo"
});
}).fail(function (error) {
}).push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -155,16 +151,14 @@
return {"otherTitle": "foo"};
};
start();
jio.get("42")
.then(function (result) {
.push(function (result) {
deepEqual(result, {
"title": "foo"
});
}).fail(function (error) {
}).push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -202,16 +196,14 @@
return {"otherTitle": "foo"};
};
start();
jio.get("42")
.then(function (result) {
.push(function (result) {
deepEqual(result, {
"title": "foo"
});
}).fail(function (error) {
}).push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -226,8 +218,7 @@
},
mapping_dict: {
"id": {"equal": "otherId"}
},
map_all_property: true
}
});
Storage2713.prototype.hasCapacity = function () {
......@@ -248,16 +239,14 @@
return {"title": "foo"};
};
start();
jio.get("42")
.then(function (result) {
.push(function (result) {
deepEqual(result, {
"title": "foo"
});
}).fail(function (error) {
}).push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -284,15 +273,13 @@
return id;
};
start();
jio.put("bar", {"title": "foo"})
.then(function (result) {
.push(function (result) {
equal(result, "bar");
})
.fail(function (error) {
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -313,15 +300,13 @@
return id;
};
start();
jio.put("bar", {})
.then(function (result) {
.push(function (result) {
equal(result, "bar");
})
.fail(function (error) {
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -354,15 +339,13 @@
return [];
};
start();
jio.put("42", {"title": "foo"})
.then(function (result) {
.push(function (result) {
equal(result, "42");
})
.fail(function (error) {
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -387,17 +370,16 @@
return id;
};
start();
jio.put("42", {"title": "foo", "smth": "bar", "smth2": "bar2"})
.then(function (result) {
.push(function (result) {
equal(result, "42");
})
.fail(function (error) {
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
/////////////////////////////////////////////////////////////////
// mappingStorage.remove
/////////////////////////////////////////////////////////////////
......@@ -417,15 +399,13 @@
return id;
};
start();
jio.remove("bar", {"title": "foo"})
.then(function (result) {
.push(function (result) {
equal(result, "bar");
})
.fail(function (error) {
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -457,17 +437,67 @@
return "foo";
};
start();
jio.remove("42")
.then(function (result) {
.push(function (result) {
equal(result, "42");
}).fail(function (error) {
}).push(undefined, function (error) {
ok(false, error);
});
});
/////////////////////////////////////////////////////////////////
// mappingStorage.remove
/////////////////////////////////////////////////////////////////
module("mappingStorage.post");
test("post with mapped property", function () {
stop();
expect(2);
var jio = jIO.createJIO({
type: "mapping",
sub_storage: {
type: "mappingstorage2713"
},
mapping_dict: {"title": {"equal": "otherTitle"}}
});
Storage2713.prototype.post = function (doc) {
deepEqual(doc, {"otherTitle": "foo"}, "remove 2713 called");
return "42";
};
start();
jio.post({"title": "foo"})
.push(function (result) {
equal(result, "42");
})
.always(function () {
start();
.push(undefined, function (error) {
ok(false, error);
});
});
test("post with id mapped", function () {
stop();
expect(2);
var jio = jIO.createJIO({
type: "mapping",
sub_storage: {
type: "mappingstorage2713"
},
mapping_dict: {"id": {"equal": "otherId"}}
});
Storage2713.prototype.post = function () {
return false;
};
start();
jio.post({"title": "foo"})
.push(undefined, function (error) {
equal(error.message, "post is not supported with id mapped");
equal(error.status_code, 400);
});
});
/////////////////////////////////////////////////////////////////
// mappingStorage.putAttachment
/////////////////////////////////////////////////////////////////
......@@ -490,15 +520,14 @@
deepEqual(attachment, blob, "putAttachment 2713 called");
return doc_id;
};
start();
jio.putAttachment("42", "2713", blob)
.then(function (result) {
.push(function (result) {
equal(result, "2713");
})
.fail(function (error) {
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -521,15 +550,14 @@
deepEqual(attachment, blob, "putAttachment 2713 called");
return doc_id;
};
start();
jio.putAttachment("42", "2713", blob)
.then(function (result) {
.push(function (result) {
equal(result, "2713");
})
.fail(function (error) {
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -564,15 +592,13 @@
return [{"id": "13"}];
};
start();
jio.putAttachment("42", "2713", blob)
.then(function (result) {
.push(function (result) {
equal(result, "2713");
})
.fail(function (error) {
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -596,15 +622,14 @@
equal(attachment, "2713", "getAttachment 2713 called");
return blob;
};
start();
jio.getAttachment("42", "2713")
.then(function (result) {
.push(function (result) {
deepEqual(result, blob);
})
.fail(function (error) {
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -626,15 +651,14 @@
equal(doc_id, "42", "getAttachment 2713 called");
return blob;
};
start();
jio.getAttachment("42", "2713")
.then(function (result) {
.push(function (result) {
deepEqual(result, blob);
})
.fail(function (error) {
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -668,15 +692,13 @@
return [{"id": "13"}];
};
start();
jio.getAttachment("42", "2713")
.then(function (result) {
.push(function (result) {
deepEqual(result, blob);
})
.fail(function (error) {
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -688,32 +710,34 @@
test("removeAttachment use sub_storage one's", function () {
stop();
expect(3);
var jio = jIO.createJIO({
type: "mapping",
sub_storage: {
type: "mappingstorage2713"
}
});
Storage2713.prototype.removeAttachment = function (doc_id, attachment) {
equal(doc_id, "42", "removeAttachment 2713 called");
equal(attachment, "2713", "getAttachment 2713 called");
return doc_id;
};
start();
jio.removeAttachment("42", "2713")
.then(function (result) {
.push(function (result) {
deepEqual(result, "2713");
})
.fail(function (error) {
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
test("removeAttachment use UriTemplate", function () {
stop();
expect(3);
var jio = jIO.createJIO({
type: "mapping",
sub_storage: {
......@@ -722,26 +746,27 @@
mapping_dict_attachment: {"2713":
{"remove": {"uri_template": "www.2713/{id}.bar"}}}
});
Storage2713.prototype.removeAttachment = function (doc_id, attachment) {
equal(doc_id, "42", "removeAttachment 2713 called");
equal(attachment, "www.2713/42.bar", "removeAttachment 2713 called");
return doc_id;
};
start();
jio.removeAttachment("42", "2713")
.then(function (result) {
.push(function (result) {
deepEqual(result, "2713");
})
.fail(function (error) {
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
test("removeAttachment with UriTemplate and id mapped", function () {
stop();
expect(4);
var jio = jIO.createJIO({
type: "mapping",
sub_storage: {
......@@ -768,15 +793,13 @@
return [{"id": "13"}];
};
start();
jio.removeAttachment("42", "2713")
.then(function (result) {
.push(function (result) {
equal(result, "2713");
})
.fail(function (error) {
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -802,6 +825,7 @@
map_all_property: true
});
start();
jio.put("42",
{
"title": "foo",
......@@ -834,9 +858,6 @@
})
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -862,6 +883,7 @@
}
});
start();
jio.put("42",
{
"title": "foo",
......@@ -894,9 +916,6 @@
})
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -921,6 +940,7 @@
}
});
start();
jio.put("42",
{
"title": "foo",
......@@ -946,9 +966,6 @@
})
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
......@@ -974,6 +991,7 @@
map_all_property: true
});
start();
jio.put("42",
{
"title": "foo",
......@@ -1002,9 +1020,60 @@
})
.push(undefined, function (error) {
ok(false, error);
});
});
test("allDocs id and prop mapped and query", function () {
stop();
expect(1);
var jio = jIO.createJIO({
type: "mapping",
query: {"query": 'otherId: "42"'},
mapping_dict: {
"id": {"equal": "otherId"},
"title": {"equal": "otherTitle"}
},
sub_storage: {
type: "query",
sub_storage: {
type: "uuid",
sub_storage: {
type: "memory"
}
}
}
});
start();
jio.put("42",
{
"title": "foo",
"smth": "bar"
})
.push(function () {
return jio.allDocs({
query: 'title: "foo"',
select_list: ["title"]
});
})
.push(function (result) {
deepEqual(result,
{
"data": {
"rows": [
{
"id": "42",
"value": {"title": "foo"},
"doc": {}
}
],
"total_rows": 1
}
}, "allDocs check");
})
.always(function () {
start();
.push(undefined, function (error) {
ok(false, error);
});
});
......@@ -1067,6 +1136,7 @@
];
};
start();
jio.bulk([{
method: "get",
parameter_list: ["id1"]
......@@ -1089,8 +1159,8 @@
"bulk test"
);
})
.always(function () {
start();
.push(undefined, function (error) {
ok(false, error);
});
});
......@@ -1116,15 +1186,14 @@
return "foobar";
};
start();
jio.repair(["foo", "bar"])
.then(function (result) {
.push(function (result) {
equal(result, "foobar", "Check repair");
})
.fail(function (error) {
.push(undefined, function (error) {
ok(false, error);
})
.always(function () {
start();
});
});
}(jIO, QUnit, Blob));
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment