diff --git a/src/jio.storage/mappingstorage.js b/src/jio.storage/mappingstorage.js index b9d8cca61208ec62fdfb8593549546cc2dab75ce..bb5e80e216ac36d6e4b9a75a0a6b2e6714576cd4 100644 --- a/src/jio.storage/mappingstorage.js +++ b/src/jio.storage/mappingstorage.js @@ -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; diff --git a/test/jio.storage/mappingstorage.tests.js b/test/jio.storage/mappingstorage.tests.js index c0c1185abc2e335c3c2f07c87f1514d5d4dcaa7a..486f51d27253906e4de37d7663713139b17e68a9 100644 --- a/test/jio.storage/mappingstorage.tests.js +++ b/test/jio.storage/mappingstorage.tests.js @@ -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