blob: 03fe2d279a9b8d3f4f77b4c7c8d36e20055946c8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
(function (callback) {
if (typeof define === 'function' && define.amd) {
define(['core/Core'], callback);
}
else {
callback();
}
}(function () {
/**
* Represents a Solr parameter.
*
* @param properties A map of fields to set. Refer to the list of public fields.
* @class Parameter
*/
AjaxSolr.Parameter = AjaxSolr.Class.extend(
/** @lends AjaxSolr.Parameter.prototype */
{
/**
* @param {Object} attributes
* @param {String} attributes.name The parameter's name.
* @param {String} [attributes.value] The parameter's value.
* @param {Object} [attributes.local] The parameter's local parameters.
*/
constructor: function (attributes) {
AjaxSolr.extend(this, {
name: null,
value: null,
locals: {}
}, attributes);
},
/**
* Returns the value. If called with an argument, sets the value.
*
* @param {String|Number|String[]|Number[]} [value] The value to set.
* @returns The value.
*/
val: function (value) {
if (value === undefined) {
return this.value;
}
else {
this.value = value;
}
},
/**
* Returns the value of a local parameter. If called with a second argument,
* sets the value of a local parameter.
*
* @param {String} name The name of the local parameter.
* @param {String|Number|String[]|Number[]} [value] The value to set.
* @returns The value.
*/
local: function (name, value) {
if (value === undefined) {
return this.locals[name];
}
else {
this.locals[name] = value;
}
},
/**
* Deletes a local parameter.
*
* @param {String} name The name of the local parameter.
*/
remove: function (name) {
delete this.locals[name];
},
/**
* Returns the Solr parameter as a query string key-value pair.
*
* <p>IE6 calls the default toString() if you write <tt>store.toString()
* </tt>. So, we need to choose another name for toString().</p>
*/
string: function () {
var pairs = [];
for (var name in this.locals) {
if (this.locals[name]) {
pairs.push(name + '=' + encodeURIComponent(this.locals[name]));
}
}
var prefix = pairs.length ? '{!' + pairs.join('%20') + '}' : '';
if (this.value) {
return this.name + '=' + prefix + this.valueString(this.value);
}
// For dismax request handlers, if the q parameter has local params, the
// q parameter must be set to a non-empty value. In case the q parameter
// has local params but is empty, use the q.alt parameter, which accepts
// wildcards.
else if (this.name == 'q' && prefix) {
return 'q.alt=' + prefix + encodeURIComponent('*:*');
}
else {
return '';
}
},
/**
* Parses a string formed by calling string().
*
* @param {String} str The string to parse.
*/
parseString: function (str) {
var param = str.match(/^([^=]+)=(?:\{!([^\}]*)\})?(.*)$/);
if (param) {
var matches;
while (matches = /([^\s=]+)=(\S*)/g.exec(decodeURIComponent(param[2]))) {
this.locals[matches[1]] = decodeURIComponent(matches[2]);
param[2] = param[2].replace(matches[0], ''); // Safari's exec seems not to do this on its own
}
if (param[1] == 'q.alt') {
this.name = 'q';
// if q.alt is present, assume it is because q was empty, as above
}
else {
this.name = param[1];
this.value = this.parseValueString(param[3]);
}
}
},
/**
* Returns the value as a URL-encoded string.
*
* @private
* @param {String|Number|String[]|Number[]} value The value.
* @returns {String} The URL-encoded string.
*/
valueString: function (value) {
value = AjaxSolr.isArray(value) ? value.join(',') : value;
return encodeURIComponent(value);
},
/**
* Parses a URL-encoded string to return the value.
*
* @private
* @param {String} str The URL-encoded string.
* @returns {Array} The value.
*/
parseValueString: function (str) {
str = decodeURIComponent(str);
return str.indexOf(',') == -1 ? str : str.split(',');
}
});
/**
* Escapes a value, to be used in, for example, an fq parameter. Surrounds
* strings containing spaces or colons in double quotes.
*
* @public
* @param {String|Number} value The value.
* @returns {String} The escaped value.
*/
AjaxSolr.Parameter.escapeValue = function (value) {
// If the field value has a space, colon, quotation mark or forward slash
// in it, wrap it in quotes, unless it is a range query or it is already
// wrapped in quotes.
if (value.match(/[ :\/"]/) && !value.match(/[\[\{]\S+ TO \S+[\]\}]/) && !value.match(/^["\(].*["\)]$/)) {
return '"' + value.replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"';
}
return value;
}
}));