share/server/nouveau.js (86 lines of code) (raw):

// 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. var Nouveau = (function () { var index_results = []; // holds temporary emitted values during index function handleIndexError(err, doc) { if (err == "fatal_error") { throw (["error", "map_runtime_error", "function raised 'fatal_error'"]); } else if (err[0] == "fatal") { throw (err); } var message = "function raised exception " + err.toSource(); if (doc) message += " with doc._id " + doc._id; log(message); }; function assertType(name, expected, actual) { if (typeof actual !== expected) { throw ({ name: 'TypeError', message: 'type of ' + name + ' must be a ' + expected + ' not ' + typeof actual }); } }; function rejectReservedName(name) { if (name.substring(0, 1) === '_') { throw ({ name: 'ReservedName', message: 'name must not start with an underscore' }); } }; return { index: function (doc) { var type = arguments[0]; var name = arguments[1]; assertType('type', 'string', type); assertType('name', 'string', name); rejectReservedName(name); switch (type) { case 'double': case 'string': var value = arguments[2]; var options = arguments[3] || {}; assertType('value', type == 'double' ? 'number' : 'string', value); index_results.push({ '@type': type, 'name': name, 'value': value, 'store': options.store, 'facet': options.facet }); break; case 'text': var value = arguments[2]; var options = arguments[3] || {}; assertType('value', 'string', value); index_results.push({ '@type': type, 'name': name, 'value': value, 'store': options.store }); break; case 'stored': var value = arguments[2]; if (typeof value != 'number' && typeof value != 'string') { throw ({ name: 'TypeError', message: 'type of ' + value + ' must be a string or number' }); } index_results.push({ '@type': type, 'name': name, 'value': value }); break; default: throw ({ name: 'TypeError', message: type + ' not supported' }); } }, indexDoc: function (doc) { Couch.recursivelySeal(doc); var buf = []; for (var fun in State.funs) { index_results = []; try { State.funs[fun](doc); buf.push(index_results); } catch (err) { handleIndexError(err, doc); buf.push([]); } } print(JSON.stringify(buf)); } } })();