-
Notifications
You must be signed in to change notification settings - Fork 211
/
Parameter.js
175 lines (160 loc) · 4.68 KB
/
Parameter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
(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;
}
}));