From acbf225e830821b48ae9d6a4abbddd8227f51bf1 Mon Sep 17 00:00:00 2001 From: Michael Hackstein Date: Wed, 26 Feb 2014 12:51:41 +0100 Subject: [PATCH 1/6] Updated the icons in the plan selection view --- .../frontend/scss/_plannerImages.scss | 74 ++++++++++- .../system/aardvark/frontend/scss/planner.css | 67 +++++++++- .../aardvark/frontend/scss/planner.scss | 2 +- .../js/templates/planScenarioSelector.ejs | 116 ++++++++++++------ 4 files changed, 211 insertions(+), 48 deletions(-) diff --git a/js/apps/system/aardvark/frontend/scss/_plannerImages.scss b/js/apps/system/aardvark/frontend/scss/_plannerImages.scss index 307257bcd3..dab6208c2f 100644 --- a/js/apps/system/aardvark/frontend/scss/_plannerImages.scss +++ b/js/apps/system/aardvark/frontend/scss/_plannerImages.scss @@ -1,6 +1,70 @@ -.scenarioImage{ - @extend %clickable; - height : 70%; - width : auto; - +.machineClass { + @extend %clear-float; + padding: 10px; + float: left; + background-color: #E1E1E1; + width: 311px; + height: 175px; + margin-left: 8px; } + +.scenarioBox { + position: absolute; + margin-top: 10px; + width: auto; + height: 65px; + left: 10px; + right: 10px; + @include border-radius(3px 3px 0 0); + border: 1px solid rgba(0, 0, 0, 0.19); + background-color: white; + + &.bottomBox { + bottom: 10px; + } +} + +.scenarioBoxHeader { + width: auto; + height: 5px; + line-height: 5px; + text-align: right; + margin-top: -5px; + padding-bottom: 5px; + border-bottom: 1px solid rgba(0, 0, 0, 0.19); +} + +.scenarioBoxText { + width: auto; + font-size: 30px; + font-weight: 700; + text-align: center; + margin-top: 17px; +} + +.scenarioMachine { + @extend %pull-left; + position: relative; + margin-right: 20px; + height: 177px; + width: 87px; + @include border-radius(3px 3px 0 0); + border: 1px solid rgba(0, 0, 0, 0.19); + background-color: white; + &:last-child { + margin-right: 0px; + } +} + + +.scenarioSingleMachine { + @extend %clear-float; + border-radius: 3px 3px 0 0; + border: 1px solid rgba(0, 0, 0, 0.19); + background-color: white; + + .scenarioMachine { + border: 1px solid transparent; + } +} + diff --git a/js/apps/system/aardvark/frontend/scss/planner.css b/js/apps/system/aardvark/frontend/scss/planner.css index e284abb491..aaa2cbcf64 100644 --- a/js/apps/system/aardvark/frontend/scss/planner.css +++ b/js/apps/system/aardvark/frontend/scss/planner.css @@ -3,13 +3,13 @@ body, input, textarea, .page-title span, .pingback a.url { font-family: 'Open Sans', sans-serif !important; font-weight: 400; } -ul.link-dropdown-menu, ul.user-dropdown-menu, ul.gv-dropdown-menu, div.navlogo, ul.navlist li, div.footer-left, li.tile, li.bigtile, li.tile a span.add-Icon, li.bigtile a span.add-Icon { +ul.link-dropdown-menu, ul.user-dropdown-menu, ul.gv-dropdown-menu, div.navlogo, ul.navlist li, div.footer-left, li.tile, li.bigtile, li.tile a span.add-Icon, li.bigtile a span.add-Icon, .scenarioMachine { float: left; } div.navmenu, div.footer-right, li.tile div.iconSet span, li.bigtile div.iconSet span { float: right; } -ul.tileList:after, div.resizecontainer:after { +ul.tileList:after, div.resizecontainer:after, .machineClass:after, .scenarioSingleMachine:after { clear: both; content: "."; display: block; @@ -17,7 +17,7 @@ ul.tileList:after, div.resizecontainer:after { height: 0px; visibility: hidden; } -.addButton, .deleteButton, a.headerButton, div.toolbox > div.gv_action_button, li.tile div.iconSet span, li.bigtile div.iconSet span, .contentDiv .icon, div.headerDropdown.headerDropdown input[type=checkbox].css-checkbox + label.css-label, .scenarioImage { +.addButton, .deleteButton, a.headerButton, div.toolbox > div.gv_action_button, li.tile div.iconSet span, li.bigtile div.iconSet span, .contentDiv .icon, div.headerDropdown.headerDropdown input[type=checkbox].css-checkbox + label.css-label { cursor: pointer; } nav.navbar, footer.footer { @@ -780,6 +780,61 @@ select.filterSelect { margin-top: 1px; margin-left: 10px !important; } -.scenarioImage { - height: 70%; - width: auto; } +.machineClass { + padding: 10px; + float: left; + background-color: #E1E1E1; + width: 311px; + height: 175px; + margin-left: 8px; } + +.scenarioBox { + position: absolute; + margin-top: 10px; + width: auto; + height: 65px; + left: 10px; + right: 10px; + -moz-border-radius: 3px 3px 0 0; + -webkit-border-radius: 3px 3px 0 0; + border-radius: 3px 3px 0 0; + border: 1px solid rgba(0, 0, 0, 0.19); + background-color: white; } + .scenarioBox.bottomBox { + bottom: 10px; } + +.scenarioBoxHeader { + width: auto; + height: 5px; + line-height: 5px; + text-align: right; + margin-top: -5px; + padding-bottom: 5px; + border-bottom: 1px solid rgba(0, 0, 0, 0.19); } + +.scenarioBoxText { + width: auto; + font-size: 30px; + font-weight: 700; + text-align: center; + margin-top: 17px; } + +.scenarioMachine { + position: relative; + margin-right: 20px; + height: 177px; + width: 87px; + -moz-border-radius: 3px 3px 0 0; + -webkit-border-radius: 3px 3px 0 0; + border-radius: 3px 3px 0 0; + border: 1px solid rgba(0, 0, 0, 0.19); + background-color: white; } + .scenarioMachine:last-child { + margin-right: 0px; } + +.scenarioSingleMachine { + border-radius: 3px 3px 0 0; + border: 1px solid rgba(0, 0, 0, 0.19); + background-color: white; } + .scenarioSingleMachine .scenarioMachine { + border: 1px solid transparent; } diff --git a/js/apps/system/aardvark/frontend/scss/planner.scss b/js/apps/system/aardvark/frontend/scss/planner.scss index 2e000a20d3..2560a8ef0e 100644 --- a/js/apps/system/aardvark/frontend/scss/planner.scss +++ b/js/apps/system/aardvark/frontend/scss/planner.scss @@ -1,4 +1,4 @@ //shared @import "shared"; // the images used in the planner -@import "plannerImages"; \ No newline at end of file +@import "plannerImages"; diff --git a/js/apps/system/aardvark/plannerFrontend/js/templates/planScenarioSelector.ejs b/js/apps/system/aardvark/plannerFrontend/js/templates/planScenarioSelector.ejs index 879ebfc50d..293907cdc9 100644 --- a/js/apps/system/aardvark/plannerFrontend/js/templates/planScenarioSelector.ejs +++ b/js/apps/system/aardvark/plannerFrontend/js/templates/planScenarioSelector.ejs @@ -1,52 +1,96 @@ From 028bf5b94b169473240805a93b11bb4c547b0e6e Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Wed, 26 Feb 2014 13:06:14 +0100 Subject: [PATCH 2/6] re-added isvolatile to result --- .../js/modules/org/arangodb/arango-collection.js | 9 ++++----- js/client/modules/org/arangodb/arango-collection.js | 9 ++++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/js/apps/system/aardvark/frontend/js/modules/org/arangodb/arango-collection.js b/js/apps/system/aardvark/frontend/js/modules/org/arangodb/arango-collection.js index 9e3c027be8..f34237ee69 100644 --- a/js/apps/system/aardvark/frontend/js/modules/org/arangodb/arango-collection.js +++ b/js/apps/system/aardvark/frontend/js/modules/org/arangodb/arango-collection.js @@ -318,6 +318,7 @@ ArangoCollection.prototype.properties = function (properties) { var attributes = { "doCompact": true, "journalSize": true, + "isVolatile": false, "waitForSync": true, "shardKeys": false, "numberOfShards": false, @@ -350,15 +351,13 @@ ArangoCollection.prototype.properties = function (properties) { var result = { }; for (a in attributes) { - if (attributes.hasOwnProperty(a) && requestResult.hasOwnProperty(a)) { + if (attributes.hasOwnProperty(a) && + requestResult.hasOwnProperty(a) && + requestResult[a] !== undefined) { result[a] = requestResult[a]; } } - if (requestResult.keyOptions !== undefined) { - result.keyOptions = requestResult.keyOptions; - } - return result; }; diff --git a/js/client/modules/org/arangodb/arango-collection.js b/js/client/modules/org/arangodb/arango-collection.js index 02d2dac23e..12d7e6a982 100644 --- a/js/client/modules/org/arangodb/arango-collection.js +++ b/js/client/modules/org/arangodb/arango-collection.js @@ -317,6 +317,7 @@ ArangoCollection.prototype.properties = function (properties) { var attributes = { "doCompact": true, "journalSize": true, + "isVolatile": false, "waitForSync": true, "shardKeys": false, "numberOfShards": false, @@ -349,15 +350,13 @@ ArangoCollection.prototype.properties = function (properties) { var result = { }; for (a in attributes) { - if (attributes.hasOwnProperty(a) && requestResult.hasOwnProperty(a)) { + if (attributes.hasOwnProperty(a) && + requestResult.hasOwnProperty(a) && + requestResult[a] !== undefined) { result[a] = requestResult[a]; } } - if (requestResult.keyOptions !== undefined) { - result.keyOptions = requestResult.keyOptions; - } - return result; }; From 8e05df99509265c6a86aaf681203105b49372230 Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Wed, 26 Feb 2014 13:21:10 +0100 Subject: [PATCH 3/6] split tests --- arangod/V8Server/v8-query.cpp | 9 + arangod/V8Server/v8-vocbase.cpp | 20 +- .../tests/shell-collection-noncluster.js | 448 ++++++++++++++++++ js/common/tests/shell-collection.js | 381 --------------- 4 files changed, 476 insertions(+), 382 deletions(-) create mode 100644 js/common/tests/shell-collection-noncluster.js diff --git a/arangod/V8Server/v8-query.cpp b/arangod/V8Server/v8-query.cpp index af5e096151..c67262fe1e 100644 --- a/arangod/V8Server/v8-query.cpp +++ b/arangod/V8Server/v8-query.cpp @@ -2298,11 +2298,20 @@ template static bool ChecksumCalculator (TRI_doc_mptr_t const* /// If the optional argument @FA{withData} is set to @LIT{true}, then the /// actual document data is also checksummed. Including the document data in /// checksumming will make the calculation slower, but is more accurate. +/// +/// Note: this method is not available in a cluster. //////////////////////////////////////////////////////////////////////////////// static v8::Handle JS_ChecksumCollection (v8::Arguments const& argv) { v8::HandleScope scope; +#ifdef TRI_ENABLE_CLUSTER + if (ServerState::instance()->isCoordinator()) { + // renaming a collection in a cluster is unsupported + TRI_V8_EXCEPTION(scope, TRI_ERROR_CLUSTER_UNSUPPORTED); + } +#endif + TRI_vocbase_col_t const* col; col = TRI_UnwrapClass(argv.Holder(), TRI_GetVocBaseColType()); diff --git a/arangod/V8Server/v8-vocbase.cpp b/arangod/V8Server/v8-vocbase.cpp index f63418447c..47b41442aa 100644 --- a/arangod/V8Server/v8-vocbase.cpp +++ b/arangod/V8Server/v8-vocbase.cpp @@ -7204,6 +7204,8 @@ static v8::Handle JS_RemoveVocbaseCol (v8::Arguments const& argv) { /// /// If renaming fails for any reason, an error is thrown. /// +/// Note: this method is not available in a cluster. +/// /// @EXAMPLES /// /// @verbinclude shell_collection-rename @@ -7216,7 +7218,14 @@ static v8::Handle JS_RenameVocbaseCol (v8::Arguments const& argv) { TRI_V8_EXCEPTION_USAGE(scope, "rename()"); } - string name = TRI_ObjectToString(argv[0]); +#ifdef TRI_ENABLE_CLUSTER + if (ServerState::instance()->isCoordinator()) { + // renaming a collection in a cluster is unsupported + TRI_V8_EXCEPTION(scope, TRI_ERROR_CLUSTER_UNSUPPORTED); + } +#endif + + string const name = TRI_ObjectToString(argv[0]); // second parameter "override" is to override renaming restrictions, e.g. // renaming from a system collection name to a non-system collection name and @@ -7417,11 +7426,20 @@ static v8::Handle JS_RevisionVocbaseCol (v8::Arguments const& argv) { /// read-only datafile). The purpose of the rotation is to include the /// datafile in a following compaction run and perform earlier garbage /// collection. +/// +/// Note: this method is not available in a cluster. //////////////////////////////////////////////////////////////////////////////// static v8::Handle JS_RotateVocbaseCol (v8::Arguments const& argv) { v8::HandleScope scope; +#ifdef TRI_ENABLE_CLUSTER + if (ServerState::instance()->isCoordinator()) { + // renaming a collection in a cluster is unsupported + TRI_V8_EXCEPTION(scope, TRI_ERROR_CLUSTER_UNSUPPORTED); + } +#endif + v8::Handle err; TRI_vocbase_col_t const* collection = UseCollection(argv.Holder(), &err); diff --git a/js/common/tests/shell-collection-noncluster.js b/js/common/tests/shell-collection-noncluster.js new file mode 100644 index 0000000000..e1310611de --- /dev/null +++ b/js/common/tests/shell-collection-noncluster.js @@ -0,0 +1,448 @@ +//////////////////////////////////////////////////////////////////////////////// +/// @brief test the collection interface +/// +/// @file +/// +/// DISCLAIMER +/// +/// Copyright 2010-2012 triagens GmbH, Cologne, Germany +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// +/// Copyright holder is triAGENS GmbH, Cologne, Germany +/// +/// @author Dr. Frank Celler +/// @author Copyright 2012, triAGENS GmbH, Cologne, Germany +//////////////////////////////////////////////////////////////////////////////// + +var jsunity = require("jsunity"); + +var arangodb = require("org/arangodb"); +var internal = require("internal"); + +var ArangoCollection = arangodb.ArangoCollection; +var db = arangodb.db; +var ERRORS = arangodb.errors; + +// ----------------------------------------------------------------------------- +// --SECTION-- collection methods +// ----------------------------------------------------------------------------- + +//////////////////////////////////////////////////////////////////////////////// +/// @brief test suite: collection +//////////////////////////////////////////////////////////////////////////////// + +function CollectionSuite () { + return { + +//////////////////////////////////////////////////////////////////////////////// +/// @brief rotate +//////////////////////////////////////////////////////////////////////////////// + + testRotate : function () { + var cn = "example"; + + db._drop(cn); + var c1 = db._create(cn); + + c1.save({ _key: "test1" }); + var f = c1.figures(); + assertEqual(0, f.datafiles.count); + + c1.rotate(); + + // must wait so the synchroniser can catch up + require("internal").wait(5); + + f = c1.figures(); + assertEqual(1, f.datafiles.count); + + c1.save({ _key: "test2" }); + c1.rotate(); + + // must wait so the synchroniser can catch up + require("internal").wait(5); + + f = c1.figures(); + // we may have one or two datafiles, depending on the compaction + assertTrue(f.datafiles.count >= 1); + + c1.unload(); + + db._drop(cn); + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief rotate w/o journal +//////////////////////////////////////////////////////////////////////////////// + + testRotateNoJournal : function () { + var cn = "example"; + + db._drop(cn); + var c1 = db._create(cn); + + try { + c1.rotate(); + fail(); + } + catch (err) { + assertEqual(ERRORS.ERROR_ARANGO_NO_JOURNAL.code, err.errorNum); + } + + db._drop(cn); + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief rename loaded collection +//////////////////////////////////////////////////////////////////////////////// + + testRenameLoaded : function () { + var cn = "example"; + var nn = "example2"; + + db._drop(cn); + db._drop(nn); + var c1 = db._create(cn); + + c1.save({ a : 1 }); + + assertTypeOf("string", c1._id); + assertEqual(cn, c1.name()); + assertTypeOf("number", c1.status()); + assertEqual(ArangoCollection.TYPE_DOCUMENT, c1.type()); + assertTypeOf("number", c1.type()); + + var id = c1._id; + + c1.rename(nn); + + assertEqual(id, c1._id); + assertEqual(nn, c1.name()); + assertTypeOf("number", c1.status()); + assertEqual(ArangoCollection.TYPE_DOCUMENT, c1.type()); + assertTypeOf("number", c1.type()); + + var c2 = db._collection(cn); + + assertEqual(null, c2); + + db._drop(nn); + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief rename unloaded collection +//////////////////////////////////////////////////////////////////////////////// + + testRenameUnloaded : function () { + var cn = "example"; + var nn = "example2"; + + db._drop(cn); + db._drop(nn); + var c1 = db._create(cn); + + c1.save({ a : 1 }); + c1.unload(); + + assertTypeOf("string", c1._id); + assertEqual(cn, c1.name()); + assertTypeOf("number", c1.status()); + assertEqual(ArangoCollection.TYPE_DOCUMENT, c1.type()); + assertTypeOf("number", c1.type()); + + var id = c1._id; + + c1.rename(nn); + + assertEqual(id, c1._id); + assertEqual(nn, c1.name()); + assertTypeOf("number", c1.status()); + assertEqual(ArangoCollection.TYPE_DOCUMENT, c1.type()); + assertTypeOf("number", c1.type()); + + var c2 = db._collection(cn); + + assertEqual(null, c2); + + db._drop(nn); + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief rename a collection to an already existing collection +//////////////////////////////////////////////////////////////////////////////// + + testRenameExisting : function () { + var cn1 = "example"; + var cn2 = "example2"; + + db._drop(cn1); + db._drop(cn2); + var c1 = db._create(cn1); + db._create(cn2); + + try { + c1.rename(cn2); + } + catch (err) { + assertEqual(ERRORS.ERROR_ARANGO_DUPLICATE_NAME.code, err.errorNum); + } + db._drop(cn1); + db._drop(cn2); + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief test checksum +//////////////////////////////////////////////////////////////////////////////// + + testChecksum : function () { + var cn = "example"; + + db._drop(cn); + var c1 = db._create(cn); + + // empty collection, checksum should be 0 + var r1 = c1.checksum(true); + assertTypeOf("string", r1.revision); + assertTrue(r1.revision !== ""); + assertTrue(r1.revision.match(/^[0-9]+$/)); + assertTypeOf("number", r1.checksum); + assertEqual(0, r1.checksum); + + // inserting a doc, checksum should change + c1.save({ a : 1 }); + var r2 = c1.checksum(true); + assertNotEqual(r1.revision, r2.revision); + assertTypeOf("string", r2.revision); + assertTrue(r2.revision !== ""); + assertTrue(r2.revision.match(/^[0-9]+$/)); + assertTypeOf("number", r2.checksum); + assertNotEqual(0, r2.checksum); + + // inserting another doc, checksum should change + c1.save({ a : 2 }); + var r3 = c1.checksum(true); + assertNotEqual(r1.revision, r3.revision); + assertNotEqual(r2.revision, r3.revision); + assertTypeOf("string", r3.revision); + assertTrue(r3.revision !== ""); + assertTrue(r3.revision.match(/^[0-9]+$/)); + assertTypeOf("number", r3.checksum); + assertNotEqual(0, r3.checksum); + assertNotEqual(r2.checksum, r3.checksum); + + // test after unloading + c1.unload(); + var r4 = c1.checksum(true); + assertTypeOf("string", r4.revision); + assertEqual(r3.revision, r4.revision); + assertTypeOf("number", r4.checksum); + assertNotEqual(0, r4.checksum); + assertEqual(r3.checksum, r4.checksum); + + // test withData + var r5 = c1.checksum(true, true); + assertTypeOf("string", r5.revision); + assertEqual(r4.revision, r5.revision); + assertTypeOf("number", r5.checksum); + assertNotEqual(0, r5.checksum); + assertNotEqual(r4.checksum, r5.checksum); + + // test after truncation + c1.truncate(); + var r6 = c1.checksum(true); + assertTypeOf("string", r6.revision); + assertNotEqual(r4.revision, r6.revision); + assertNotEqual(r5.revision, r6.revision); + assertTypeOf("number", r6.checksum); + assertEqual(0, r6.checksum); + + db._drop(cn); + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief test checksum +//////////////////////////////////////////////////////////////////////////////// + + testChecksumEdge : function () { + var cn = "example"; + var vn = "example2"; + + db._drop(cn); + db._drop(vn); + db._create(vn); + var c1 = db._createEdgeCollection(cn); + + var r1 = c1.checksum(true); + assertTypeOf("string", r1.revision); + assertTrue(r1.revision !== ""); + assertTrue(r1.revision.match(/^[0-9]+$/)); + assertTypeOf("number", r1.checksum); + assertEqual(0, r1.checksum); + + c1.save(vn + "/1", vn + "/2", { a : 1 }); + var r2 = c1.checksum(true); + assertNotEqual(r1.revision, r2.revision); + assertTypeOf("string", r2.revision); + assertTrue(r2.revision !== ""); + assertTrue(r2.revision.match(/^[0-9]+$/)); + assertTypeOf("number", r2.checksum); + assertNotEqual(0, r2.checksum); + + c1.save(vn + "/1", vn + "/2", { a : 2 }); + var r3 = c1.checksum(true); + assertNotEqual(r1.revision, r3.revision); + assertNotEqual(r2.revision, r3.revision); + assertTypeOf("string", r3.revision); + assertTrue(r3.revision !== ""); + assertTrue(r3.revision.match(/^[0-9]+$/)); + assertTypeOf("number", r3.checksum); + assertNotEqual(0, r3.checksum); + assertNotEqual(r2.checksum, r3.checksum); + + c1.unload(); + var r4 = c1.checksum(true); + assertTypeOf("string", r4.revision); + assertEqual(r3.revision, r4.revision); + assertTypeOf("number", r4.checksum); + assertEqual(r3.checksum, r4.checksum); + + // test withData + var r5 = c1.checksum(true, true); + assertTypeOf("string", r5.revision); + assertEqual(r4.revision, r5.revision); + assertTypeOf("number", r5.checksum); + assertNotEqual(0, r5.checksum); + assertNotEqual(r4.checksum, r5.checksum); + + // test after truncation + c1.truncate(); + var r6 = c1.checksum(true); + assertTypeOf("string", r6.revision); + assertNotEqual(r4.revision, r6.revision); + assertNotEqual(r5.revision, r6.revision); + assertTypeOf("number", r6.checksum); + assertEqual(0, r6.checksum); + + db._drop(cn); + db._drop(vn); + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief test checksum two different collections +//////////////////////////////////////////////////////////////////////////////// + + testChecksumDifferent : function () { + var cn1 = "example"; + var cn2 = "example2"; + + db._drop(cn1); + db._drop(cn2); + var c1 = db._create(cn1); + var c2 = db._create(cn2); + + // collections are empty, checksums are identical + var cs1 = c1.checksum().checksum; + var cs2 = c2.checksum().checksum; + + assertEqual(cs1, cs2); + + c1.save({ _key: "foobar", value: 123 }); + c2.save({ _key: "foobar", value: 123 }); + + // keys are the same + cs1 = c1.checksum().checksum; + cs2 = c2.checksum().checksum; + + assertEqual(cs1, cs2); + + // data is the same + cs1 = c1.checksum(false, true).checksum; + cs2 = c2.checksum(false, true).checksum; + + assertEqual(cs1, cs2); + + // revisions are different + cs1 = c1.checksum(true, false).checksum; + cs2 = c2.checksum(true, false).checksum; + + assertNotEqual(cs1, cs2); + + // revisions are still different + cs1 = c1.checksum(true, true).checksum; + cs2 = c2.checksum(true, true).checksum; + + assertNotEqual(cs1, cs2); + + // update document in c1, keep data + c1.replace("foobar", { value: 123 }); + + // keys are still the same + cs1 = c1.checksum().checksum; + cs2 = c2.checksum().checksum; + + assertEqual(cs1, cs2); + + // data is still the same + cs1 = c1.checksum(false, true).checksum; + cs2 = c2.checksum(false, true).checksum; + + assertEqual(cs1, cs2); + + // revisions are still different + cs1 = c1.checksum(true, false).checksum; + cs2 = c2.checksum(true, false).checksum; + + // update document in c1, changing data + c1.replace("foobar", { value: 124 }); + + // keys are still the same + cs1 = c1.checksum().checksum; + cs2 = c2.checksum().checksum; + + assertEqual(cs1, cs2); + + // data is not the same + cs1 = c1.checksum(false, true).checksum; + cs2 = c2.checksum(false, true).checksum; + + assertNotEqual(cs1, cs2); + + // revisions are still different + cs1 = c1.checksum(true, false).checksum; + cs2 = c2.checksum(true, false).checksum; + + db._drop(cn1); + db._drop(cn2); + } + + }; +} + +// ----------------------------------------------------------------------------- +// --SECTION-- main +// ----------------------------------------------------------------------------- + +//////////////////////////////////////////////////////////////////////////////// +/// @brief executes the test suites +//////////////////////////////////////////////////////////////////////////////// + +jsunity.run(CollectionSuite); + +return jsunity.done(); + +// Local Variables: +// mode: outline-minor +// outline-regexp: "^\\(/// @brief\\|/// @addtogroup\\|// --SECTION--\\|/// @page\\|/// @}\\)" +// End: + diff --git a/js/common/tests/shell-collection.js b/js/common/tests/shell-collection.js index 07b5f6ad60..2959c3a57b 100644 --- a/js/common/tests/shell-collection.js +++ b/js/common/tests/shell-collection.js @@ -631,64 +631,6 @@ function CollectionSuite () { db._drop(cn); }, -//////////////////////////////////////////////////////////////////////////////// -/// @brief rotate -//////////////////////////////////////////////////////////////////////////////// - - testRotate : function () { - var cn = "example"; - - db._drop(cn); - var c1 = db._create(cn); - - c1.save({ _key: "test1" }); - var f = c1.figures(); - assertEqual(0, f.datafiles.count); - - c1.rotate(); - - // must wait so the synchroniser can catch up - require("internal").wait(5); - - f = c1.figures(); - assertEqual(1, f.datafiles.count); - - c1.save({ _key: "test2" }); - c1.rotate(); - - // must wait so the synchroniser can catch up - require("internal").wait(5); - - f = c1.figures(); - // we may have one or two datafiles, depending on the compaction - assertTrue(f.datafiles.count >= 1); - - c1.unload(); - - db._drop(cn); - }, - -//////////////////////////////////////////////////////////////////////////////// -/// @brief rotate w/o journal -//////////////////////////////////////////////////////////////////////////////// - - testRotateNoJournal : function () { - var cn = "example"; - - db._drop(cn); - var c1 = db._create(cn); - - try { - c1.rotate(); - fail(); - } - catch (err) { - assertEqual(ERRORS.ERROR_ARANGO_NO_JOURNAL.code, err.errorNum); - } - - db._drop(cn); - }, - //////////////////////////////////////////////////////////////////////////////// /// @brief figures //////////////////////////////////////////////////////////////////////////////// @@ -784,329 +726,6 @@ function CollectionSuite () { db._drop(cn); }, -//////////////////////////////////////////////////////////////////////////////// -/// @brief rename loaded collection -//////////////////////////////////////////////////////////////////////////////// - - testRenameLoaded : function () { - var cn = "example"; - var nn = "example2"; - - db._drop(cn); - db._drop(nn); - var c1 = db._create(cn); - - c1.save({ a : 1 }); - - assertTypeOf("string", c1._id); - assertEqual(cn, c1.name()); - assertTypeOf("number", c1.status()); - assertEqual(ArangoCollection.TYPE_DOCUMENT, c1.type()); - assertTypeOf("number", c1.type()); - - var id = c1._id; - - c1.rename(nn); - - assertEqual(id, c1._id); - assertEqual(nn, c1.name()); - assertTypeOf("number", c1.status()); - assertEqual(ArangoCollection.TYPE_DOCUMENT, c1.type()); - assertTypeOf("number", c1.type()); - - var c2 = db._collection(cn); - - assertEqual(null, c2); - - db._drop(nn); - }, - -//////////////////////////////////////////////////////////////////////////////// -/// @brief rename unloaded collection -//////////////////////////////////////////////////////////////////////////////// - - testRenameUnloaded : function () { - var cn = "example"; - var nn = "example2"; - - db._drop(cn); - db._drop(nn); - var c1 = db._create(cn); - - c1.save({ a : 1 }); - c1.unload(); - - assertTypeOf("string", c1._id); - assertEqual(cn, c1.name()); - assertTypeOf("number", c1.status()); - assertEqual(ArangoCollection.TYPE_DOCUMENT, c1.type()); - assertTypeOf("number", c1.type()); - - var id = c1._id; - - c1.rename(nn); - - assertEqual(id, c1._id); - assertEqual(nn, c1.name()); - assertTypeOf("number", c1.status()); - assertEqual(ArangoCollection.TYPE_DOCUMENT, c1.type()); - assertTypeOf("number", c1.type()); - - var c2 = db._collection(cn); - - assertEqual(null, c2); - - db._drop(nn); - }, - -//////////////////////////////////////////////////////////////////////////////// -/// @brief rename a collection to an already existing collection -//////////////////////////////////////////////////////////////////////////////// - - testRenameExisting : function () { - var cn1 = "example"; - var cn2 = "example2"; - - db._drop(cn1); - db._drop(cn2); - var c1 = db._create(cn1); - db._create(cn2); - - try { - c1.rename(cn2); - } - catch (err) { - assertEqual(ERRORS.ERROR_ARANGO_DUPLICATE_NAME.code, err.errorNum); - } - db._drop(cn1); - db._drop(cn2); - }, - -//////////////////////////////////////////////////////////////////////////////// -/// @brief test checksum -//////////////////////////////////////////////////////////////////////////////// - - testChecksum : function () { - var cn = "example"; - - db._drop(cn); - var c1 = db._create(cn); - - // empty collection, checksum should be 0 - var r1 = c1.checksum(true); - assertTypeOf("string", r1.revision); - assertTrue(r1.revision !== ""); - assertTrue(r1.revision.match(/^[0-9]+$/)); - assertTypeOf("number", r1.checksum); - assertEqual(0, r1.checksum); - - // inserting a doc, checksum should change - c1.save({ a : 1 }); - var r2 = c1.checksum(true); - assertNotEqual(r1.revision, r2.revision); - assertTypeOf("string", r2.revision); - assertTrue(r2.revision !== ""); - assertTrue(r2.revision.match(/^[0-9]+$/)); - assertTypeOf("number", r2.checksum); - assertNotEqual(0, r2.checksum); - - // inserting another doc, checksum should change - c1.save({ a : 2 }); - var r3 = c1.checksum(true); - assertNotEqual(r1.revision, r3.revision); - assertNotEqual(r2.revision, r3.revision); - assertTypeOf("string", r3.revision); - assertTrue(r3.revision !== ""); - assertTrue(r3.revision.match(/^[0-9]+$/)); - assertTypeOf("number", r3.checksum); - assertNotEqual(0, r3.checksum); - assertNotEqual(r2.checksum, r3.checksum); - - // test after unloading - c1.unload(); - var r4 = c1.checksum(true); - assertTypeOf("string", r4.revision); - assertEqual(r3.revision, r4.revision); - assertTypeOf("number", r4.checksum); - assertNotEqual(0, r4.checksum); - assertEqual(r3.checksum, r4.checksum); - - // test withData - var r5 = c1.checksum(true, true); - assertTypeOf("string", r5.revision); - assertEqual(r4.revision, r5.revision); - assertTypeOf("number", r5.checksum); - assertNotEqual(0, r5.checksum); - assertNotEqual(r4.checksum, r5.checksum); - - // test after truncation - c1.truncate(); - var r6 = c1.checksum(true); - assertTypeOf("string", r6.revision); - assertNotEqual(r4.revision, r6.revision); - assertNotEqual(r5.revision, r6.revision); - assertTypeOf("number", r6.checksum); - assertEqual(0, r6.checksum); - - db._drop(cn); - }, - -//////////////////////////////////////////////////////////////////////////////// -/// @brief test checksum -//////////////////////////////////////////////////////////////////////////////// - - testChecksumEdge : function () { - var cn = "example"; - var vn = "example2"; - - db._drop(cn); - db._drop(vn); - db._create(vn); - var c1 = db._createEdgeCollection(cn); - - var r1 = c1.checksum(true); - assertTypeOf("string", r1.revision); - assertTrue(r1.revision !== ""); - assertTrue(r1.revision.match(/^[0-9]+$/)); - assertTypeOf("number", r1.checksum); - assertEqual(0, r1.checksum); - - c1.save(vn + "/1", vn + "/2", { a : 1 }); - var r2 = c1.checksum(true); - assertNotEqual(r1.revision, r2.revision); - assertTypeOf("string", r2.revision); - assertTrue(r2.revision !== ""); - assertTrue(r2.revision.match(/^[0-9]+$/)); - assertTypeOf("number", r2.checksum); - assertNotEqual(0, r2.checksum); - - c1.save(vn + "/1", vn + "/2", { a : 2 }); - var r3 = c1.checksum(true); - assertNotEqual(r1.revision, r3.revision); - assertNotEqual(r2.revision, r3.revision); - assertTypeOf("string", r3.revision); - assertTrue(r3.revision !== ""); - assertTrue(r3.revision.match(/^[0-9]+$/)); - assertTypeOf("number", r3.checksum); - assertNotEqual(0, r3.checksum); - assertNotEqual(r2.checksum, r3.checksum); - - c1.unload(); - var r4 = c1.checksum(true); - assertTypeOf("string", r4.revision); - assertEqual(r3.revision, r4.revision); - assertTypeOf("number", r4.checksum); - assertEqual(r3.checksum, r4.checksum); - - // test withData - var r5 = c1.checksum(true, true); - assertTypeOf("string", r5.revision); - assertEqual(r4.revision, r5.revision); - assertTypeOf("number", r5.checksum); - assertNotEqual(0, r5.checksum); - assertNotEqual(r4.checksum, r5.checksum); - - // test after truncation - c1.truncate(); - var r6 = c1.checksum(true); - assertTypeOf("string", r6.revision); - assertNotEqual(r4.revision, r6.revision); - assertNotEqual(r5.revision, r6.revision); - assertTypeOf("number", r6.checksum); - assertEqual(0, r6.checksum); - - db._drop(cn); - db._drop(vn); - }, - -//////////////////////////////////////////////////////////////////////////////// -/// @brief test checksum two different collections -//////////////////////////////////////////////////////////////////////////////// - - testChecksumDifferent : function () { - var cn1 = "example"; - var cn2 = "example2"; - - db._drop(cn1); - db._drop(cn2); - var c1 = db._create(cn1); - var c2 = db._create(cn2); - - // collections are empty, checksums are identical - var cs1 = c1.checksum().checksum; - var cs2 = c2.checksum().checksum; - - assertEqual(cs1, cs2); - - c1.save({ _key: "foobar", value: 123 }); - c2.save({ _key: "foobar", value: 123 }); - - // keys are the same - cs1 = c1.checksum().checksum; - cs2 = c2.checksum().checksum; - - assertEqual(cs1, cs2); - - // data is the same - cs1 = c1.checksum(false, true).checksum; - cs2 = c2.checksum(false, true).checksum; - - assertEqual(cs1, cs2); - - // revisions are different - cs1 = c1.checksum(true, false).checksum; - cs2 = c2.checksum(true, false).checksum; - - assertNotEqual(cs1, cs2); - - // revisions are still different - cs1 = c1.checksum(true, true).checksum; - cs2 = c2.checksum(true, true).checksum; - - assertNotEqual(cs1, cs2); - - // update document in c1, keep data - c1.replace("foobar", { value: 123 }); - - // keys are still the same - cs1 = c1.checksum().checksum; - cs2 = c2.checksum().checksum; - - assertEqual(cs1, cs2); - - // data is still the same - cs1 = c1.checksum(false, true).checksum; - cs2 = c2.checksum(false, true).checksum; - - assertEqual(cs1, cs2); - - // revisions are still different - cs1 = c1.checksum(true, false).checksum; - cs2 = c2.checksum(true, false).checksum; - - // update document in c1, changing data - c1.replace("foobar", { value: 124 }); - - // keys are still the same - cs1 = c1.checksum().checksum; - cs2 = c2.checksum().checksum; - - assertEqual(cs1, cs2); - - // data is not the same - cs1 = c1.checksum(false, true).checksum; - cs2 = c2.checksum(false, true).checksum; - - assertNotEqual(cs1, cs2); - - // revisions are still different - cs1 = c1.checksum(true, false).checksum; - cs2 = c2.checksum(true, false).checksum; - - db._drop(cn1); - db._drop(cn2); - }, - //////////////////////////////////////////////////////////////////////////////// /// @brief test revision id //////////////////////////////////////////////////////////////////////////////// From b634aff8a8194a3d51c71c2da119308c4ae39d2f Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Wed, 26 Feb 2014 13:45:08 +0100 Subject: [PATCH 4/6] renamed test --- UnitTests/Makefile.unittests | 1 + ...l-collection-noncluster.js => shell-noncluster-collection.js} | 0 2 files changed, 1 insertion(+) rename js/common/tests/{shell-collection-noncluster.js => shell-noncluster-collection.js} (100%) diff --git a/UnitTests/Makefile.unittests b/UnitTests/Makefile.unittests index 9841d967ad..6a04870d8c 100755 --- a/UnitTests/Makefile.unittests +++ b/UnitTests/Makefile.unittests @@ -358,6 +358,7 @@ SHELL_COMMON = \ @top_srcdir@/js/common/tests/shell-collection.js \ @top_srcdir@/js/common/tests/shell-collection-volatile.js \ @top_srcdir@/js/common/tests/shell-crypto.js \ + @top_srcdir@/js/common/tests/shell-noncluster-collection.js \ @top_srcdir@/js/common/tests/shell-noncluster-database.js \ @top_srcdir@/js/common/tests/shell-document.js \ @top_srcdir@/js/common/tests/shell-download.js \ diff --git a/js/common/tests/shell-collection-noncluster.js b/js/common/tests/shell-noncluster-collection.js similarity index 100% rename from js/common/tests/shell-collection-noncluster.js rename to js/common/tests/shell-noncluster-collection.js From 7b9fcf59da7b0ffa211569b449ff14622d41ea1f Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Wed, 26 Feb 2014 13:53:07 +0100 Subject: [PATCH 5/6] documentation --- js/actions/api-collection.js | 4 ++++ js/actions/api-index.js | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/js/actions/api-collection.js b/js/actions/api-collection.js index f9129cf667..627a1b59e1 100644 --- a/js/actions/api-collection.js +++ b/js/actions/api-collection.js @@ -750,6 +750,8 @@ function get_api_collections (req, res) { /// /// - `revision`: The collection revision id as a string. /// +/// Note: this method is not available in a cluster. +/// /// @RESTRETURNCODES /// /// @RESTRETURNCODE{400} @@ -1301,6 +1303,8 @@ function put_api_collection_rename (req, res, collection) { /// /// - `result`: will be `true` if rotation succeeded /// +/// Note: this method is not available in a cluster. +/// /// @RESTRETURNCODES /// /// @RESTRETURNCODE{400} diff --git a/js/actions/api-index.js b/js/actions/api-index.js index 01555a0c53..4ffd635ccc 100644 --- a/js/actions/api-index.js +++ b/js/actions/api-index.js @@ -311,6 +311,8 @@ function get_api_index (req, res) { /// `ignoreNull` is true, then documents with a null in `location` or at /// least one null in `latitude` or `longitude` are ignored. /// +/// Note: unique indexes on non-shard keys are not supported in a cluster. +/// /// @RESTRETURNCODES /// /// @RESTRETURNCODE{200} @@ -386,6 +388,8 @@ function get_api_index (req, res) { /// /// - `unique`: If `true`, then create a unique index. /// +/// Note: unique indexes on non-shard keys are not supported in a cluster. +/// /// @RESTRETURNCODES /// /// @RESTRETURNCODE{200} @@ -466,6 +470,8 @@ function get_api_index (req, res) { /// /// - `unique`: If `true`, then create a unique index. /// +/// Note: unique indexes on non-shard keys are not supported in a cluster. +/// /// @RESTRETURNCODES /// /// @RESTRETURNCODE{200} @@ -674,6 +680,9 @@ function get_api_index (req, res) { /// - fulltext indexes /// - bitarray indexes /// +/// Note also that unique indexes on non-shard keys are not supported in a +/// cluster. +/// /// @RESTRETURNCODES /// /// @RESTRETURNCODE{200} From 5c3d81eea363fae989419bdffee6aca2e098dbab Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Wed, 26 Feb 2014 13:53:23 +0100 Subject: [PATCH 6/6] test split --- js/common/tests/shell-collection.js | 60 ++-------------- .../tests/shell-noncluster-collection.js | 70 +++++++++++++++++++ 2 files changed, 74 insertions(+), 56 deletions(-) diff --git a/js/common/tests/shell-collection.js b/js/common/tests/shell-collection.js index 2959c3a57b..0a15cb2ffc 100644 --- a/js/common/tests/shell-collection.js +++ b/js/common/tests/shell-collection.js @@ -1036,69 +1036,17 @@ function CollectionSuite () { //////////////////////////////////////////////////////////////////////////////// testSystemSpecial : function () { - [ '_trx', '_users' ].forEach(function(cn) { - var c = db._collection(cn); + var cn = "_users"; + var c = db._collection(cn); - // drop - try { - c.drop(); - fail(); - } - catch (err1) { - assertEqual(ERRORS.ERROR_FORBIDDEN.code, err1.errorNum); - } - - // rename - var cn = "example"; - db._drop(cn); - - try { - c.rename(cn); - fail(); - } - catch (err2) { - assertEqual(ERRORS.ERROR_FORBIDDEN.code, err2.errorNum); - } - - // unload is allowed - c.unload(); - - }); - }, - -//////////////////////////////////////////////////////////////////////////////// -/// @brief test special properties of replication collection -//////////////////////////////////////////////////////////////////////////////// - - testSpecialReplication : function () { - var repl = db._collection('_replication'); - - // drop is not allowed + // drop try { - repl.drop(); + c.drop(); fail(); } catch (err1) { assertEqual(ERRORS.ERROR_FORBIDDEN.code, err1.errorNum); } - - // rename is not allowed - try { - var cn = "example"; - db._drop(cn); - repl.rename(cn); - } - catch (err2) { - assertEqual(ERRORS.ERROR_FORBIDDEN.code, err2.errorNum); - } - - // unload is not allowed - try { - repl.unload(); - } - catch (err3) { - assertEqual(ERRORS.ERROR_FORBIDDEN.code, err3.errorNum); - } } }; diff --git a/js/common/tests/shell-noncluster-collection.js b/js/common/tests/shell-noncluster-collection.js index e1310611de..ac45c37feb 100644 --- a/js/common/tests/shell-noncluster-collection.js +++ b/js/common/tests/shell-noncluster-collection.js @@ -424,6 +424,76 @@ function CollectionSuite () { db._drop(cn1); db._drop(cn2); + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief test system collection dropping / renaming / unloading +//////////////////////////////////////////////////////////////////////////////// + + testSystemSpecial : function () { + [ '_trx', '_users' ].forEach(function(cn) { + var c = db._collection(cn); + + // drop + try { + c.drop(); + fail(); + } + catch (err1) { + assertEqual(ERRORS.ERROR_FORBIDDEN.code, err1.errorNum); + } + + // rename + var cn = "example"; + db._drop(cn); + + try { + c.rename(cn); + fail(); + } + catch (err2) { + assertEqual(ERRORS.ERROR_FORBIDDEN.code, err2.errorNum); + } + + // unload is allowed + c.unload(); + + }); + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief test special properties of replication collection +//////////////////////////////////////////////////////////////////////////////// + + testSpecialReplication : function () { + var repl = db._collection('_replication'); + + // drop is not allowed + try { + repl.drop(); + fail(); + } + catch (err1) { + assertEqual(ERRORS.ERROR_FORBIDDEN.code, err1.errorNum); + } + + // rename is not allowed + try { + var cn = "example"; + db._drop(cn); + repl.rename(cn); + } + catch (err2) { + assertEqual(ERRORS.ERROR_FORBIDDEN.code, err2.errorNum); + } + + // unload is not allowed + try { + repl.unload(); + } + catch (err3) { + assertEqual(ERRORS.ERROR_FORBIDDEN.code, err3.errorNum); + } } };