solrium 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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>