solrium 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. data/LICENSE.txt +712 -0
  2. data/README.markdown +51 -0
  3. data/Rakefile +24 -0
  4. data/VERSION.yml +4 -0
  5. data/bin/solr +9 -0
  6. data/lib/jars/jetty/ant-1.6.5.jar +0 -0
  7. data/lib/jars/jetty/commons-codec-1.3.jar +0 -0
  8. data/lib/jars/jetty/commons-fileupload-1.2.jar +0 -0
  9. data/lib/jars/jetty/jetty-7.0.0.pre5.jar +0 -0
  10. data/lib/jars/jetty/jetty-util-7.0.0.pre5.jar +0 -0
  11. data/lib/jars/jetty/jsp-2.1.jar +0 -0
  12. data/lib/jars/jetty/jsp-api-2.1.jar +0 -0
  13. data/lib/jars/jetty/servlet-api-3.0.pre4.jar +0 -0
  14. data/lib/jars/lucene/lucene-analyzers-2.4-dev.jar +0 -0
  15. data/lib/jars/lucene/lucene-core-2.4-dev.jar +0 -0
  16. data/lib/jars/lucene/lucene-highlighter-2.4-dev.jar +0 -0
  17. data/lib/jars/lucene/lucene-memory-2.4-dev.jar +0 -0
  18. data/lib/jars/lucene/lucene-queries-2.4-dev.jar +0 -0
  19. data/lib/jars/lucene/lucene-snowball-2.4-dev.jar +0 -0
  20. data/lib/jars/lucene/lucene-spellchecker-2.4-dev.jar +0 -0
  21. data/lib/jars/solr/apache-solr-common-1.3.0.jar +0 -0
  22. data/lib/jars/solr/apache-solr-core-1.3.0.jar +0 -0
  23. data/lib/jars/solr/commons-io-1.2.jar +0 -0
  24. data/lib/jars/solr/stax-1.2.0-dev.jar +0 -0
  25. data/lib/jars/solr/stax-api-1.0.jar +0 -0
  26. data/lib/jars/solr/stax-utils.jar +0 -0
  27. data/lib/jars/solr/xpp3-1.1.3.4.O.jar +0 -0
  28. data/lib/jetty.rb +83 -0
  29. data/lib/lucene.rb +33 -0
  30. data/lib/queries.rb +60 -0
  31. data/lib/remote.rb +22 -0
  32. data/lib/solr.rb +69 -0
  33. data/lib/solr_ext.rb +81 -0
  34. data/lib/webapp/admin/_info.jsp +110 -0
  35. data/lib/webapp/admin/action.jsp +116 -0
  36. data/lib/webapp/admin/analysis.jsp +456 -0
  37. data/lib/webapp/admin/analysis.xsl +179 -0
  38. data/lib/webapp/admin/distributiondump.jsp +158 -0
  39. data/lib/webapp/admin/favicon.ico +0 -0
  40. data/lib/webapp/admin/form.jsp +129 -0
  41. data/lib/webapp/admin/get-file.jsp +72 -0
  42. data/lib/webapp/admin/get-properties.jsp +24 -0
  43. data/lib/webapp/admin/header.jsp +41 -0
  44. data/lib/webapp/admin/index.jsp +154 -0
  45. data/lib/webapp/admin/jquery-1.2.3.min.js +32 -0
  46. data/lib/webapp/admin/logging.jsp +50 -0
  47. data/lib/webapp/admin/logging.xsl +91 -0
  48. data/lib/webapp/admin/meta.xsl +34 -0
  49. data/lib/webapp/admin/ping.jsp +65 -0
  50. data/lib/webapp/admin/ping.xsl +71 -0
  51. data/lib/webapp/admin/raw-schema.jsp +38 -0
  52. data/lib/webapp/admin/registry.jsp +107 -0
  53. data/lib/webapp/admin/registry.xsl +287 -0
  54. data/lib/webapp/admin/schema.jsp +661 -0
  55. data/lib/webapp/admin/solr-admin.css +206 -0
  56. data/lib/webapp/admin/solr-head.gif +0 -0
  57. data/lib/webapp/admin/solr-head.png +0 -0
  58. data/lib/webapp/admin/solr-lowercase.gif +0 -0
  59. data/lib/webapp/admin/solr-lowercase.png +0 -0
  60. data/lib/webapp/admin/stats.jsp +94 -0
  61. data/lib/webapp/admin/stats.xsl +220 -0
  62. data/lib/webapp/admin/tabular.xsl +141 -0
  63. data/lib/webapp/admin/threaddump.jsp +110 -0
  64. data/lib/webapp/admin/threaddump.xsl +103 -0
  65. data/lib/webapp/favicon.ico +0 -0
  66. data/lib/webapp/index.jsp +42 -0
  67. metadata +120 -0
@@ -0,0 +1,661 @@
1
+ <%@ page contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
2
+ <%--
3
+ Licensed to the Apache Software Foundation (ASF) under one or more
4
+ contributor license agreements. See the NOTICE file distributed with
5
+ this work for additional information regarding copyright ownership.
6
+ The ASF licenses this file to You under the Apache License, Version 2.0
7
+ (the "License"); you may not use this file except in compliance with
8
+ the License. You may obtain a copy of the License at
9
+
10
+ http://www.apache.org/licenses/LICENSE-2.0
11
+
12
+ Unless required by applicable law or agreed to in writing, software
13
+ distributed under the License is distributed on an "AS IS" BASIS,
14
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ See the License for the specific language governing permissions and
16
+ limitations under the License.
17
+ --%>
18
+
19
+ <%-- $Id: index.jsp 608150 2008-01-02 17:15:30Z ryan $ --%>
20
+ <%-- $Source: /cvs/main/searching/SolrServer/resources/admin/index.jsp,v $ --%>
21
+ <%-- $Name: $ --%>
22
+
23
+ <script src="jquery-1.2.3.min.js"></script>
24
+ <script>
25
+
26
+ (function($, libName) {
27
+ var solr = {
28
+
29
+ //The default location of the luke handler relative to this page
30
+ // Can be overridden in the init(url) method
31
+ pathToLukeHandler: 'luke',
32
+
33
+ // Base properties to hold schema information
34
+ schemaInfo: {},
35
+ schemaFields: {},
36
+ schemaDynamicFields: {},
37
+ schemaTypes: {},
38
+ schemaFlags: {},
39
+
40
+ //The basic function to call to make the initail JSON calls
41
+ // takes one option parameter, the path to the luke handler
42
+ // if undefined, it will use the default, 'luke', which means
43
+ // this is being called from the same relative URL path
44
+ init: function(pathToLukeHandler) {
45
+ if (pathToLukeHandler != undefined) {
46
+ solr.pathToLukeHandler = pathToLukeHandler;
47
+ }
48
+ solr.loadSchema(function() {
49
+ solr.loadFromLukeHandler(function () {
50
+ solr.createMenu('menu');
51
+ solr.displaySchemaInfo();
52
+ });
53
+ });
54
+
55
+ },
56
+
57
+ //load the Schema from the LukeRequestHandler
58
+ // this loads every field, and in each field the copy source/dests and flags
59
+ // we also load the list of field types, and the list of flags
60
+ loadSchema: function(func) {
61
+ $.getJSON(solr.pathToLukeHandler +'?show=schema&wt=json', function(data) {
62
+ //populate all non field/type/flag data in the info block
63
+ $.each(data.index, function(i, item) {
64
+ solr.schemaInfo[i] = item;
65
+ });
66
+
67
+ //LukeRequestHandler places these two attributes outside of the "index" node, but
68
+ // we want it here so we can more easily display it in the "HOME" block
69
+ solr.schemaInfo['uniqueKeyField'] = data.schema.uniqueKeyField;
70
+ solr.schemaInfo['defaultSearchField'] = data.schema.defaultSearchField;
71
+ //a one-off hack, because the directory string is so long and unbroken
72
+ // that it can break CSS layouts
73
+ solr.schemaInfo['directory'] = solr.schemaInfo['directory'].substring(0, solr.schemaInfo['directory'].indexOf('@')+1) + ' ' + solr.schemaInfo['directory'].substring(solr.schemaInfo['directory'].indexOf('@') +1);
74
+
75
+ // populate the list of fields
76
+ $.each(data.schema.fields, function(i,item){
77
+ solr.schemaFields[i]=item;
78
+ });
79
+ // populate the list of field types
80
+ $.each(data.schema.types, function(type, ft) {
81
+ solr.schemaTypes[type] = ft;
82
+ });
83
+ //populate the list of dynamic fields
84
+ $.each(data.schema.dynamicFields, function(i, dynField) {
85
+ solr.schemaDynamicFields[i] = dynField;
86
+ });
87
+ //populate the list of flags, so we can convert flags to text in display
88
+ $.each(data.info.key, function(i, flag) {
89
+ solr.schemaFlags[i] = flag;
90
+ });
91
+
92
+ //LukeRequestHandler returns copyFields src/dest as the entire toString of the field
93
+ // we only need the field name, so here we loop through the fields, and replace the full
94
+ // field definitions with the name in the copySources/copyDests properties
95
+ $.each(solr.schemaFields, function(i, field) {
96
+ $.each(['copySources', 'copyDests'], function(i, copyProp) {
97
+ var newFields = new Array();
98
+ $.each(field[copyProp], function(i, fullName) {
99
+ newFields.push(fullName.substring(fullName.lastIndexOf(':')+1, fullName.indexOf('{')));
100
+ });
101
+ field[copyProp] = newFields;
102
+ });
103
+
104
+ });
105
+ //An additional optional callback
106
+ // used in init to trigger the 2nd call to LukeRequestHandler only
107
+ // after the first one is finished
108
+ if ($.isFunction(func)) {
109
+ func(solr);
110
+ }
111
+ });
112
+ },
113
+
114
+ //further populates the loaded schema with information gathered
115
+ // from the no argument LukeRequestHandler
116
+ loadFromLukeHandler: function(func) {
117
+ $.getJSON(solr.pathToLukeHandler+'?wt=json', function(data) {
118
+ $.each(data.fields, function(i, item) {
119
+ var field = solr.schemaFields[i];
120
+
121
+ //If undefined, then we have a dynamicField which does not show up
122
+ // in the LukeRequestHandler show=schema variant
123
+ if (field == undefined) {
124
+ field = item;
125
+ //Attach this field to its dynamicField
126
+ var base = field.dynamicBase;
127
+ var dynField = solr.schemaDynamicFields[base];
128
+
129
+ //Some fields in a multicore setting have no dynamic base, either
130
+ // the name of the core is a field that has no type or flags
131
+ if (dynField != undefined) {
132
+ var synFields = dynField['fields'];
133
+ if (synFields== undefined) {
134
+ synFields= new Array();
135
+ }
136
+ synFields.push(i);
137
+ dynField['fields'] = synFields;
138
+ }
139
+ solr.schemaFields[i] = item;
140
+ }
141
+ //Populate other data in this field that would not have been loaded in
142
+ // the show=schema variant
143
+ $.each(item, function(k, v) {
144
+ if (k == 'topTerms' || k == 'histogram') {
145
+ solr.schemaFields[i][k] = solr.lukeArrayToHash(v);
146
+ } else {
147
+ solr.schemaFields[i][k] = v;
148
+ }
149
+ });
150
+ });
151
+ //another optional callback; used in the init case to lay out the page
152
+ // after the data is loaded
153
+ if ($.isFunction(func)) {
154
+ func();
155
+ }
156
+ });
157
+ },
158
+ //some elements in the JSON response are arrays, where odd/even elements
159
+ // are the name/value, and convert it to a standard map/associative array
160
+ // incoming: ['foo', 'bar', 'bat', 'baz']
161
+ // output: {'foo':'bar', 'bat':baz'}
162
+ lukeArrayToHash: function(termsArr) {
163
+ var hash = new Object();
164
+ var temp;
165
+ //topTerms comes in as an array, with odd indexes the field name
166
+ // and even indexes the number
167
+ $.each(termsArr, function(i, item) {
168
+ if (i%2 ==0) {
169
+ temp = item;
170
+ } else {
171
+ hash[temp] = item;
172
+ }
173
+ });
174
+ return hash;
175
+ },
176
+
177
+ //gets the top Terms via an Ajax call the LukeRequestHandler for that field
178
+ // The callback is used here to redraw the table after the ajax call returns
179
+ getTopTerms: function(fieldName, numTerms, func) {
180
+ if (numTerms == undefined) {
181
+ var numTerms = 10;
182
+ }
183
+ if (isNaN(numTerms) || numTerms <=0 || numTerms.indexOf('.') != -1) {
184
+ return;
185
+ }
186
+ $.getJSON(solr.pathToLukeHandler+'?fl='+fieldName+'&wt=json&numTerms='+numTerms, function(data) {
187
+ solr.schemaFields[fieldName]['topTerms'] = solr.lukeArrayToHash(data.fields[fieldName].topTerms);
188
+ if ($.isFunction(func)) {
189
+ func(solr.schemaFields[fieldName]['topTerms'], fieldName);
190
+ }
191
+ });
192
+ },
193
+
194
+ // Displays the SchemaInfo in the main content panel
195
+ // dispayed on data load, and also when 'Home' is clicked
196
+ displaySchemaInfo: function() {
197
+ $('#mainInfo').html('');
198
+ $('#topTerms').html('');
199
+ $('#histogram').html('');
200
+ $('#mainInfo').append(solr.createSimpleText('Schema Information'));
201
+ //Make sure the uniqueKeyField and defaultSearchFields come first
202
+ $.each({'Unique Key':'uniqueKeyField', 'Default Search Field':'defaultSearchField'}, function(text, prop) {
203
+ if (solr.schemaInfo[prop] != undefined) {
204
+ $('#mainInfo').append(solr.createNameValueText(text, function(p) {
205
+ p.appendChild(solr.createLink(solr.schemaInfo[prop], solr.schemaInfo[prop]));
206
+ return p;
207
+ }));
208
+ }
209
+ });
210
+ $.each(solr.schemaInfo, function(i, item) {
211
+ if (i == 'uniqueKeyField' || i == 'defaultSearchField') {
212
+ //noop; we took care of this above
213
+ } else {
214
+ $('#mainInfo').append(solr.createNameValueText(i, item));
215
+ }
216
+ });
217
+ //Close all menus when we display schema home
218
+ solr.toggleMenus(undefined, ['fields', 'types', 'dynFields']);
219
+ },
220
+
221
+ // display a dynamic field in the main content panel
222
+ displayDynamicField: function(dynamicPattern) {
223
+ var df = solr.schemaDynamicFields[dynamicPattern];
224
+ $('#mainInfo').html('');
225
+ $('#topTerms').html('');
226
+ $('#histogram').html('');
227
+ $('#mainInfo').append(solr.createSimpleText('Dynamic Field: ' + dynamicPattern));
228
+ $('#mainInfo').append(solr.createNameValueText('Fields', function(p) {
229
+ if (df.fields != undefined) {
230
+ $.each(df.fields, function(i, item) {
231
+ p.appendChild(solr.createLink(item, item));
232
+ });
233
+ } else {
234
+ p.appendChild(document.createTextNode(' None currently in index'));
235
+ }
236
+ return p;
237
+ }));
238
+ var ft = solr.schemaTypes[df.type];
239
+ $('#mainInfo').append(solr.createNameValueText('Field Type', function(p) {
240
+ p.appendChild(solr.createLink(df.type, df.type, solr.displayFieldType));
241
+ return p;
242
+ }));
243
+ if (df.flags != undefined) {
244
+ $('#mainInfo').append(solr.createNameValueText('Properties', solr.createTextFromFlags(df.flags, df.type)));
245
+ }
246
+ solr.displayAnalyzer(ft.indexAnalyzer, 'Index Analyzer', true);
247
+ solr.displayAnalyzer(ft.queryAnalyzer, 'Query Analyzer', true);
248
+
249
+ solr.toggleMenus('dynFields', ['fields', 'types'], dynamicPattern);
250
+ },
251
+
252
+ // display a field type in the main area
253
+ displayFieldType: function(typeName) {
254
+ var ft = solr.schemaTypes[typeName];
255
+ $('#mainInfo').html('');
256
+ $('#topTerms').html('');
257
+ $('#histogram').html('');
258
+ $('#mainInfo').append(solr.createSimpleText('Field Type: ' + typeName));
259
+ $('#mainInfo').append(solr.createNameValueText('Fields', function(p) {
260
+ if (ft.fields != undefined) {
261
+ $.each(ft.fields, function(i, item) {
262
+ if (solr.schemaFields[item] != undefined) {
263
+ p.appendChild(solr.createLink(item, item));
264
+ } else {
265
+ p.appendChild(solr.createLink(item, item, solr.displayDynamicField));
266
+ }
267
+ p.appendChild(document.createTextNode(' '));
268
+ });
269
+ } else {
270
+ p.appendChild(document.createTextNode('No fields in index'));
271
+ }
272
+ return p;
273
+ }));
274
+ $('#mainInfo').append(solr.createNameValueText('Tokenized', ft.tokenized));
275
+ $('#mainInfo').append(solr.createNameValueText('Class Name', ft.className));
276
+
277
+ solr.displayAnalyzer(ft.indexAnalyzer, 'Index Analyzer');
278
+ solr.displayAnalyzer(ft.queryAnalyzer, 'Query Analyzer');
279
+ solr.toggleMenus('types', ['fields', 'dynFields'], typeName);
280
+ },
281
+
282
+ //Displays information about an Analyzer in the main content area
283
+ displayAnalyzer: function(analyzer, type, shouldCollapse) {
284
+ var tid = type.replace(' ', '');
285
+ var collapse = shouldCollapse && (analyzer.tokenizer != undefined || analyzer.filters != undefined);
286
+ $('#mainInfo').append(solr.createNameValueText(type, function(p) {
287
+ p.appendChild(document.createTextNode(analyzer.className + ' '));
288
+ if (collapse) {
289
+ p.appendChild(solr.createLink(type, 'Details', function() {
290
+ $('#'+tid).toggle("slow");
291
+ }));
292
+ }
293
+ return p;
294
+ }));
295
+ var adiv = document.createElement('div');
296
+ adiv.id=tid;
297
+ adiv.className='analyzer';
298
+ if (collapse) {
299
+ adiv.style.display='none';
300
+ }
301
+ if (analyzer.tokenizer != undefined) {
302
+ adiv.appendChild(solr.createNameValueText("Tokenizer Class", analyzer.tokenizer.className));
303
+ }
304
+ if (analyzer.filters != undefined) {
305
+ adiv.appendChild(solr.createNameValueText('Filters', ''));
306
+ var f = document.createElement('ol');
307
+ $.each(analyzer.filters, function(i, item) {
308
+ var fil = document.createElement('li');
309
+ var filterText = item.className;
310
+ if (item.args != undefined) {
311
+ filterText += ' args:{'
312
+ $.each(item.args, function(fi, fitem) {
313
+ filterText += fi + ': ' + fitem + ' ';
314
+ });
315
+ filterText +='}';
316
+ fil.innerHTML = filterText;
317
+ f.appendChild(fil);
318
+ }
319
+ });
320
+ adiv.appendChild(f);
321
+ }
322
+ $('#mainInfo').append(adiv);
323
+ },
324
+
325
+ // display information about a Field in the main content area
326
+ // and its TopTerms and Histogram in related divs
327
+ displayField: function(fieldName) {
328
+ var field = solr.schemaFields[fieldName];
329
+ var isDynamic = field.dynamicBase != undefined ? true : false;
330
+ var ft;
331
+ var ftName;
332
+ $('#mainInfo').html('');
333
+ $('#topTerms').html('');
334
+ $('#histogram').html('');
335
+ $('#mainInfo').append(solr.createSimpleText('Field: ' + fieldName));
336
+
337
+ //For regular fields, we take their properties; for dynamicFields,
338
+ // we take them from their dynamicField definitions
339
+ if (isDynamic) {
340
+ ftName = solr.schemaDynamicFields[field.dynamicBase].type
341
+ $('#mainInfo').append(solr.createNameValueText('Dynamically Created From Pattern', function(p) {
342
+ p.appendChild(solr.createLink(field.dynamicBase, field.dynamicBase, solr.displayDynamicField));
343
+ return p;
344
+ }));
345
+ } else {
346
+ ftName = field.type;
347
+ }
348
+ ft = solr.schemaTypes[field.type];
349
+ $('#mainInfo').append(solr.createNameValueText('Field Type', function(p) {
350
+ p.appendChild(solr.createLink(ftName, ftName, solr.displayFieldType));
351
+ return p;
352
+ }));
353
+ if (solr.schemaFlags != '') {
354
+ $.each({'flags':'Properties', 'schema':'Schema', 'index':'Index'}, function(prop, text) {
355
+ if (field[prop] != undefined) {
356
+ $('#mainInfo').append(solr.createNameValueText(text, solr.createTextFromFlags(field[prop], ft)));
357
+ }
358
+ });
359
+ }
360
+ $.each({'copySources':'Copied From', 'copyDests':'Copied Into'}, function(prop, text) {
361
+ if (field[prop] != undefined && field[prop] != '') {
362
+ $('#mainInfo').append(solr.createNameValueText(text, function(p) {
363
+ $.each(field[prop], function(i, item) {
364
+ p.appendChild(solr.createLink(item, item));
365
+ p.appendChild(document.createTextNode(' '));
366
+ });
367
+ return p;
368
+ }));
369
+ }
370
+ });
371
+ if (field.positionIncrementGap != undefined) {
372
+ $('#mainInfo').append(solr.createNameValueText('Position Increment Gap', field.positionIncrementGap));
373
+ }
374
+ solr.displayAnalyzer(ft.indexAnalyzer, 'Index Analyzer', true);
375
+ solr.displayAnalyzer(ft.queryAnalyzer, 'Query Analyzer', true);
376
+ if (field.docs != undefined) {
377
+ $('#mainInfo').append(solr.createNameValueText('Docs', field.docs));
378
+ }
379
+ if (field.distinct != undefined) {
380
+ $('#mainInfo').append(solr.createNameValueText('Distinct', field.distinct));
381
+ }
382
+
383
+ if (field.topTerms != undefined) {
384
+ solr.displayTopTerms(field.topTerms, fieldName);
385
+ }
386
+
387
+ if (field.histogram != undefined) {
388
+ solr.drawHistogram(field.histogram);
389
+ }
390
+ solr.toggleMenus('fields', ['types', 'dynFields'], fieldName);
391
+ },
392
+
393
+ //utility method to create a single sentence list of properties from a flag set
394
+ // or pass it on, if the flags are (unstored field)
395
+ createTextFromFlags: function(fieldFlags, fieldType) {
396
+ var value;
397
+ if (fieldFlags != '(unstored field)') {
398
+ var value = '';
399
+ for (var i=0;i<fieldFlags.length;i++) {
400
+ if (fieldFlags.charAt(i) != '-') {
401
+ value += solr.schemaFlags[fieldFlags.charAt(i)];
402
+ value += ', ';
403
+ }
404
+ }
405
+ value = value.substring(0, value.length-2);
406
+ } else {
407
+ value = fieldFlags;
408
+ }
409
+ return value;
410
+ },
411
+
412
+ //Store the currently highlighted menu item, as otherwise we
413
+ // must traverse all li menu items, which is very slow on schemas with
414
+ // large number of fields
415
+ // for example $('#menu ul li').siblings().removeClass('selected');
416
+ currentlyHighlightedMenuId: undefined,
417
+
418
+ //add a highlight to the currently selected menu item, and remove
419
+ // the highlights from all other menu items
420
+ highlightMenuItem: function(idToSelect) {
421
+ if (solr.currentlyHighlightedMenuId != undefined) {
422
+ $('#'+solr.currentlyHighlightedMenuId).removeClass('selected');
423
+ }
424
+ $('#'+idToSelect).addClass('selected');
425
+ solr.currentlyHighlightedMenuId = idToSelect;
426
+ },
427
+
428
+ //Opens one menu group, close the others, and optionally highlight one
429
+ // item, which should be in the opened menu
430
+ toggleMenus: function(idToShow, idsToHide, idToSelect) {
431
+ if (idToSelect != undefined) {
432
+ solr.highlightMenuItem(idToShow + idToSelect);
433
+ }
434
+ $('#'+idToShow).show("slow");
435
+ $.each(idsToHide, function(i, idToHide) {
436
+ $('#'+idToHide).hide("slow");
437
+ });
438
+ },
439
+
440
+ //A utility method to create a paragraph, which takes two arguments;
441
+ // an opening text, and either text or a callback function to follow
442
+ // any callback function must return the node passed into it
443
+ createNameValueText: function(openingText, func) {
444
+ var p = document.createElement('p');
445
+ p.appendChild(solr.createSimpleText(openingText + ': ', 'b'));
446
+ return solr.applyFuncToNode(p, func);
447
+ },
448
+
449
+ //utility method to create an HTML text element node
450
+ // with the literal text to place, and an optional function to apply
451
+ // any callback function must return the node passed into it
452
+ createSimpleText: function(text, n, func) {
453
+ if (n == undefined) {
454
+ n = 'h2';
455
+ }
456
+ var no= document.createElement(n);
457
+ no.appendChild(document.createTextNode(text));
458
+ return solr.applyFuncToNode(no, func);
459
+ },
460
+
461
+ //Utility method that applies a function or a string to append
462
+ // an additional child to a node
463
+ applyFuncToNode: function(no, func) {
464
+ if ($.isFunction(func)) {
465
+ no = func(no);
466
+ } else {
467
+ // if it is not a function, append it as a string
468
+ if (func != undefined) {
469
+ no.appendChild(document.createTextNode(' ' + func));
470
+ }
471
+ }
472
+ return no;
473
+ },
474
+
475
+ //show a table of top terms for a given field
476
+ displayTopTerms: function(topTerms, fieldName) {
477
+ $('#topTerms').html('');
478
+ var tbl = document.createElement('table');
479
+ tbl.className='topTerms';
480
+ var thead= document.createElement('thead');
481
+ var headerRow = document.createElement('tr');
482
+ $.each(['term', 'frequency'], function() {
483
+ var cell = document.createElement('th');
484
+ cell.innerHTML= this;
485
+ headerRow.appendChild(cell);
486
+ });
487
+ thead.appendChild(headerRow);
488
+ tbl.appendChild(thead);
489
+ var tbody = document.createElement('tbody');
490
+
491
+ var numTerms = 0;
492
+ $.each(topTerms, function(term, count) {
493
+ var row = document.createElement('tr');
494
+ var c1 = document.createElement('td');
495
+ c1.innerHTML=term;
496
+ var c2 = document.createElement('td');
497
+ c2.innerHTML=count;
498
+ row.appendChild(c1);
499
+ row.appendChild(c2);
500
+ tbody.appendChild(row);
501
+ numTerms++;
502
+ });
503
+ tbl.appendChild(tbody);
504
+
505
+ //create a header along with an input widget so the user
506
+ // can request a different number of Top Terms
507
+ var h2 = document.createElement('h2');
508
+ h2.appendChild(document.createTextNode('Top '));
509
+ var termsGetter = document.createElement('input');
510
+ termsGetter.type='text';
511
+ termsGetter.size=5;
512
+ termsGetter.value=numTerms;
513
+
514
+ termsGetter.onchange=function() {
515
+ solr.getTopTerms(fieldName, this.value, solr.displayTopTerms);
516
+ }
517
+ h2.appendChild(termsGetter);
518
+ h2.appendChild(document.createTextNode(' Terms'));
519
+ $('#topTerms').append(h2);
520
+
521
+ document.getElementById('topTerms').appendChild(tbl);
522
+ $('#topTerms').append(tbl);
523
+ },
524
+
525
+ //draws a histogram, taking a map of values and an optional total height and width for the table
526
+ drawHistogram: function(histogram, totalHeightArg, totalWidthArg) {
527
+ $('#histogram').html('');
528
+ $('#histogram').append(solr.createSimpleText('Histogram'));
529
+ var max = 0;
530
+ var bars =0;
531
+ //find the # of columns and max value in the histogram
532
+ // so we can create an appropriately scaled chart
533
+ $.each(histogram, function(i, item) {
534
+ if (item > max) max = item;
535
+ bars += 1;
536
+ });
537
+ if (max ==0) {
538
+ $('#histogram').append(solr.createNameValueText('No histogram available'));
539
+ } else {
540
+ var totalHeight = totalHeightArg == undefined ? 208 : totalHeightArg;
541
+ var totalWidth = totalWidthArg == undefined ? 160 : totalWidthArg;
542
+ var tbl = document.createElement('table');
543
+ tbl.style.width=totalWidth+'px';
544
+ tbl.className = 'histogram';
545
+ var h = document.createElement('tbody');
546
+ var r = document.createElement('tr');
547
+ var r2 = document.createElement('tr');
548
+ $.each(histogram, function(i, item) {
549
+ var c = document.createElement('td');
550
+ c.innerHTML=item+'<div style="width:'+totalWidth/bars+'px;height:'+(item*totalHeight/max)+'px;background:blue">&nbsp</div>';
551
+ r.appendChild(c);
552
+ var c2 = document.createElement('td');
553
+ c2.innerHTML='' + i;
554
+ r2.appendChild(c2);
555
+ });
556
+ h.appendChild(r);
557
+ h.appendChild(r2);
558
+ tbl.appendChild(h);
559
+ $('#histogram').append(tbl);
560
+ }
561
+ },
562
+
563
+ //dynamically creates a link to be appended
564
+ createLink: function(idToDisplay, linkText, linkFunction) {
565
+ var link = document.createElement('a');
566
+ if (!$.isFunction(linkFunction)) {
567
+ linkFunction = solr.displayField
568
+ }
569
+ link.onclick=function() {
570
+ linkFunction(idToDisplay);
571
+ return false;
572
+ };
573
+ link.href='#';
574
+ link.innerHTML=linkText;
575
+ return link;
576
+ },
577
+
578
+ //Creates a menu header that can expand or collapse its children
579
+ createMenuHeader: function(text, idToShow, idsToHide) {
580
+ var head = document.createElement('h3');
581
+ var a = document.createElement('a');
582
+ a.onclick=function() {
583
+ solr.toggleMenus(idToShow, idsToHide);
584
+ return false;
585
+ };
586
+ a.href='#';
587
+ a.innerHTML=text;
588
+ head.appendChild(a);
589
+ return head;
590
+ },
591
+
592
+ //Creates an element in a menu (e.g. each field in a list of fields)
593
+ createMenuItem: function(tagName, text, link, type, func) {
594
+ var fieldEle = document.createElement('li');
595
+ fieldEle.id=type+text;
596
+ var funct = func == undefined ? undefined : func;
597
+ fieldEle.appendChild(solr.createLink(text, link, funct));
598
+ return fieldEle;
599
+ },
600
+
601
+ //populates the menu div
602
+ createMenu: function(menuId) {
603
+ var m = $('#'+menuId);
604
+ var home = document.createElement('h2');
605
+ home.appendChild(solr.createLink('Home', 'Home', solr.displaySchemaInfo));
606
+ m.append(home);
607
+ m.append(solr.createMenuHeader('Fields', 'fields', ['types', 'dynFields']));
608
+ var fields= document.createElement('ul');
609
+ fields.style.display='none';
610
+ fields.id = 'fields';
611
+ $.each(solr.schemaFields, function(i, item) {
612
+ fields.appendChild(solr.createMenuItem('li', i, i, fields.id));
613
+ });
614
+ m.append(fields);
615
+ m.append(solr.createMenuHeader('Dynamic Fields', 'dynFields', ['fields', 'types']));
616
+ var dyns = document.createElement('ul');
617
+ dyns.style.display = 'none';
618
+ dyns.id = 'dynFields';
619
+ $.each(solr.schemaDynamicFields, function(i, item) {
620
+ dyns.appendChild(solr.createMenuItem('li', i,i, dyns.id, solr.displayDynamicField));
621
+ });
622
+ m.append(dyns);
623
+ m.append(solr.createMenuHeader('Field Types', 'types', ['fields', 'dynFields']));
624
+ var types = document.createElement('ul');
625
+ types.style.display='none';
626
+ types.id='types';
627
+ $.each(this.schemaTypes, function(i, item) {
628
+ types.appendChild(solr.createMenuItem('li', i, i,types.id, solr.displayFieldType));
629
+ });
630
+ m.append(types);
631
+ }
632
+ };
633
+
634
+ window[libName] = solr;
635
+ })(jQuery, 'solr');
636
+ $(document).ready(function() {
637
+ solr.init();
638
+ });
639
+
640
+ $(window).unload( function() {
641
+ solr = null;
642
+ $('#mainInfo').html('');
643
+ $('#menu').html('');
644
+ $('#topTerms').html('');
645
+ $('#histogram').html('');
646
+ });
647
+
648
+ </script>
649
+ <%-- do a verbatim include so we can use the local vars --%>
650
+ <%@include file="header.jsp" %>
651
+ <div id="schemaTop">
652
+ <h2>Schema Browser | See <a href="file/?file=schema.xml">Raw Schema.xml</a></h2>
653
+ </div>
654
+ <div id="menu"></div>
655
+ <div id="content">
656
+ <div id="mainInfo"><h2>Please wait...loading and parsing Schema Information from LukeRequestHandler</h2><p>If it does not load or your browser is not javascript or ajax-capable, you may wish to examine your schema using the <a href="luke?wt=xslt&tr=luke.xsl">Server side transformed LukeRequestHandler</a> or the raw <a href="file/?file=schema.xml">schema.xml</a> instead.</div>
657
+ <div id="topTerms"></div>
658
+ <div id="histogram"></div>
659
+ </div>
660
+ </body>
661
+ </html>