// 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. couchTests.view_collation = function(debug) { var db = new CouchDB("test_suite_db", {"X-Couch-Full-Commit":"false"}); db.deleteDb(); db.createDb(); if (debug) debugger; // NOTE, the values are already in their correct sort order. Consider this // a specification of collation of json types. var values = []; // special values sort before all other types values.push(null); values.push(false); values.push(true); // then numbers values.push(1); values.push(2); values.push(3.0); values.push(4); // then text, case sensitive values.push("a"); values.push("A"); values.push("aa"); values.push("b"); values.push("B"); values.push("ba"); values.push("bb"); // then arrays. compared element by element until different. // Longer arrays sort after their prefixes values.push(["a"]); values.push(["b"]); values.push(["b","c"]); values.push(["b","c", "a"]); values.push(["b","d"]); values.push(["b","d", "e"]); // then object, compares each key value in the list until different. // larger objects sort after their subset objects. values.push({a:1}); values.push({a:2}); values.push({b:1}); values.push({b:2}); values.push({b:2, a:1}); // Member order does matter for collation. // CouchDB preserves member order // but doesn't require that clients will. // (this test might fail if used with a js engine // that doesn't preserve order) values.push({b:2, c:2}); for (var i=0; i<values.length; i++) { db.save({_id:(i).toString(), foo:values[i]}); } var queryFun = function(doc) { emit(doc.foo, null); }; var rows = db.query(queryFun).rows; for (i=0; i<values.length; i++) { T(equals(rows[i].key, values[i])); } // everything has collated correctly. Now to check the descending output rows = db.query(queryFun, null, {descending: true}).rows; for (i=0; i<values.length; i++) { T(equals(rows[i].key, values[values.length - 1 -i])); } // now check the key query args for (i=1; i<values.length; i++) { var queryOptions = {key:values[i]}; rows = db.query(queryFun, null, queryOptions).rows; T(rows.length == 1 && equals(rows[0].key, values[i])); } // test inclusive_end=true (the default) // the inclusive_end=true functionality is limited to endkey currently // if you need inclusive_start=false for startkey, please do implement. ;) var rows = db.query(queryFun, null, {endkey : "b", inclusive_end:true}).rows; T(rows[rows.length-1].key == "b"); // descending=true var rows = db.query(queryFun, null, {endkey : "b", descending:true, inclusive_end:true}).rows; T(rows[rows.length-1].key == "b"); // test inclusive_end=false var rows = db.query(queryFun, null, {endkey : "b", inclusive_end:false}).rows; T(rows[rows.length-1].key == "aa"); // descending=true var rows = db.query(queryFun, null, {endkey : "b", descending:true, inclusive_end:false}).rows; T(rows[rows.length-1].key == "B"); var rows = db.query(queryFun, null, { endkey : "b", endkey_docid: "10", inclusive_end:false}).rows; T(rows[rows.length-1].key == "aa"); var rows = db.query(queryFun, null, { endkey : "b", endkey_docid: "11", inclusive_end:false}).rows; T(rows[rows.length-1].key == "b"); };