repertoire-faceting 0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/FAQ +161 -0
- data/INSTALL +7 -0
- data/LICENSE +22 -0
- data/README +531 -0
- data/TODO +104 -0
- data/ext/Makefile +27 -0
- data/ext/README.signature +33 -0
- data/ext/extconf.rb +3 -0
- data/ext/signature.c +740 -0
- data/ext/signature.sql.IN +338 -0
- data/ext/uninstall_signature.sql.IN +4 -0
- data/lib/repertoire-faceting/adapters/abstract_adapter.rb +18 -0
- data/lib/repertoire-faceting/adapters/postgresql_adapter.rb +81 -0
- data/lib/repertoire-faceting/controller.rb +46 -0
- data/lib/repertoire-faceting/errors.rb +6 -0
- data/lib/repertoire-faceting/facets/abstract_facet.rb +80 -0
- data/lib/repertoire-faceting/facets/basic_facet.rb +66 -0
- data/lib/repertoire-faceting/facets/nested_facet.rb +91 -0
- data/lib/repertoire-faceting/model.rb +204 -0
- data/lib/repertoire-faceting/rails/postgresql_adapter.rb +14 -0
- data/lib/repertoire-faceting/rails/relation.rb +10 -0
- data/lib/repertoire-faceting/rails/routes.rb +10 -0
- data/lib/repertoire-faceting/railtie.rb +17 -0
- data/lib/repertoire-faceting/relation/calculations.rb +54 -0
- data/lib/repertoire-faceting/relation/query_methods.rb +45 -0
- data/lib/repertoire-faceting/relation/spawn_methods.rb +26 -0
- data/lib/repertoire-faceting/routing.rb +28 -0
- data/lib/repertoire-faceting/tasks.rake +29 -0
- data/lib/repertoire-faceting/version.rb +5 -0
- data/lib/repertoire-faceting.rb +38 -0
- data/public/images/repertoire-faceting/proportional_symbol.png +0 -0
- data/public/images/repertoire-faceting/spinner_sm.gif +0 -0
- data/public/javascripts/google-earth-extensions.js +6805 -0
- data/public/javascripts/protovis.js +7725 -0
- data/public/javascripts/rep.faceting/context.js +133 -0
- data/public/javascripts/rep.faceting/ext/earth_facet.js +439 -0
- data/public/javascripts/rep.faceting/facet.js +131 -0
- data/public/javascripts/rep.faceting/facet_widget.js +88 -0
- data/public/javascripts/rep.faceting/nested_facet.js +92 -0
- data/public/javascripts/rep.faceting/results.js +64 -0
- data/public/javascripts/rep.faceting.js +45 -0
- data/public/javascripts/rep.protovis-facets.js +234 -0
- data/public/stylesheets/rep.faceting.css +18 -0
- metadata +182 -0
data/FAQ
ADDED
@@ -0,0 +1,161 @@
|
|
1
|
+
= Repertoire Faceting FAQ =
|
2
|
+
|
3
|
+
= About facet indexing and the signature SQL type =
|
4
|
+
|
5
|
+
Q. What's the scalability of this thing?
|
6
|
+
|
7
|
+
A. Up to about 500,000 items, supposing 6-8 simultaneous facets with domains anywhere from 2-100 values. In other words, beyond
|
8
|
+
the size of most commonly available datasets. See the citizens example in the specs directory & example faceting app.
|
9
|
+
|
10
|
+
It has been tested with up to 1,000,000 items, but this requires unix configuration to give Postgresql lots of shared memory.
|
11
|
+
|
12
|
+
|
13
|
+
Q. My nested facet widget is empty!
|
14
|
+
|
15
|
+
A. Did you remember to call expand_nesting(<facet index table>, <facet name>) after creating your index?
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
= About the ajax faceting widgets =
|
20
|
+
|
21
|
+
Q. How do I send page-specific data (for example, a search field) to the webservice with the facet widgets' data?
|
22
|
+
|
23
|
+
A. If you provide a function to the facet_context plugin, it will merge the params you return before dispatching to
|
24
|
+
the webservice, e.g.
|
25
|
+
|
26
|
+
$('#invoices').facet_context(function() {
|
27
|
+
return {
|
28
|
+
search: $("#search_field").val()
|
29
|
+
};
|
30
|
+
});
|
31
|
+
|
32
|
+
|
33
|
+
Q. I want to change the default options for all widgets of a given class.
|
34
|
+
|
35
|
+
A. See the syntax for defining jquery plugins - you can alter the defaults for all widgets by reassigning them in your
|
36
|
+
view code.
|
37
|
+
|
38
|
+
Q. How do I make one-time, minor changes to the behaviour of a widget? For example, I want to add a control.
|
39
|
+
|
40
|
+
A. Use the inject option, which is part of the base functionality. Your injector function receives a reference to the
|
41
|
+
widget's jquery element and to the widget javascript object. Use jquery to add your control's markup, then
|
42
|
+
register an event handler to add its behaviour. For example, this injector adds a clear-all button in the title:
|
43
|
+
|
44
|
+
$('#genre').facet({
|
45
|
+
injectors: {
|
46
|
+
'.title .controls' : function(self, data) { $(this).append('<span class="clear_control">[x]</span>'); }
|
47
|
+
},
|
48
|
+
handlers: {
|
49
|
+
'click!.clear_control' : function(self) {
|
50
|
+
self.refinements('genre').length = 0;
|
51
|
+
self.state_changed();
|
52
|
+
return false;
|
53
|
+
}
|
54
|
+
}
|
55
|
+
});
|
56
|
+
|
57
|
+
The injector adds markup for the control at the specific jquery selector, and the handler receives events on that markup. Both
|
58
|
+
receive a single argument 'self' for the widget object, and 'this' for the matched DOM element.
|
59
|
+
|
60
|
+
Note the syntax used to identify a handler's event and dom element: '<event.namespace>!<target>'. Both event and namespace
|
61
|
+
are optional - leave them out to register a click handler with a unique namespace.
|
62
|
+
|
63
|
+
In injectors and handlers, you have access to the complete faceting widget API (state, refinements, toggle, is_selected, etc.).
|
64
|
+
You can basically build a new widget, if you need to. See the documentation for the faceting_widget class for details.
|
65
|
+
|
66
|
+
|
67
|
+
Q. My additonal control needs to send data back to the webservice too.
|
68
|
+
|
69
|
+
A. You can pre-process the entire context's state before it's sent to the webservice by update():
|
70
|
+
|
71
|
+
var min = 5;
|
72
|
+
$('#genre').facet({
|
73
|
+
injectors: { ... },
|
74
|
+
handlers: { ... },
|
75
|
+
pre_update: function(state) { state.minimum = genre_min; }
|
76
|
+
}
|
77
|
+
|
78
|
+
|
79
|
+
Q. How do I subclass an existing widget, so I can reuse my changes repeatedly?
|
80
|
+
|
81
|
+
A. Basically you define a new widget class and move your injectors and handlers (above) into the appropriate places. See the
|
82
|
+
results widget for the simplest possible example, and nested_facet for a real-world example that extends the default facet
|
83
|
+
widget. At a bare minimum, you will over-ride the render() method, and possibly the update() method too. Here's a 'hello
|
84
|
+
world' that extends the default facet count widget:
|
85
|
+
|
86
|
+
var hello_world = function($elem, options) {
|
87
|
+
/* declare superclass */
|
88
|
+
var self = repertoire.facet($elem, options);
|
89
|
+
|
90
|
+
/* handlers */
|
91
|
+
handler('.hello', function() {
|
92
|
+
alert('hello, world!');
|
93
|
+
});
|
94
|
+
|
95
|
+
/* injectors */
|
96
|
+
var $template_fn = self.render;
|
97
|
+
self.render = function(data) {
|
98
|
+
var $markup = $template_fn(data);
|
99
|
+
$markup.find('.title .controls').append('<div class='hello'>click me!</div');
|
100
|
+
return $markup;
|
101
|
+
}
|
102
|
+
|
103
|
+
return self;
|
104
|
+
}
|
105
|
+
|
106
|
+
|
107
|
+
Q. That's great, but how do I turn it into a jquery plugin I can actually use?
|
108
|
+
|
109
|
+
A. Call the plugin method and assign it to a variable in the jquery prototype. If provided, the line following sets universal
|
110
|
+
options defaults for the widget.
|
111
|
+
|
112
|
+
$.fn.hello_world = repertoire.plugin(hello_world);
|
113
|
+
$.fn.hello_world.defaults = { ... }; // put default options here
|
114
|
+
|
115
|
+
|
116
|
+
Q. How do these widgets relate to each other?
|
117
|
+
|
118
|
+
A. Here is the class hierarchy:
|
119
|
+
|
120
|
+
facet_widget (abstract)
|
121
|
+
+--- facet
|
122
|
+
+--- nesting_facet
|
123
|
+
+--- results
|
124
|
+
|
125
|
+
|
126
|
+
Q. In my widget or handler, how do I override an event handler from the superclass?
|
127
|
+
|
128
|
+
A. Register another handler to the exact same event and namespace. E.g. toggling selection for facet value counts
|
129
|
+
in the default facet widget is registered under the jquery event/namespace 'click.toggle_value'. To over-ride:
|
130
|
+
|
131
|
+
... [ in widget's constructor function ]
|
132
|
+
|
133
|
+
self.handler('click.toggle_value!.facet .value', function() {
|
134
|
+
... redefined event handler
|
135
|
+
}
|
136
|
+
...
|
137
|
+
|
138
|
+
|
139
|
+
Q. My widget needs to send additional data to the webservice, pre-process the state, compute my own query string, or
|
140
|
+
use a different webservice.
|
141
|
+
|
142
|
+
A. You can over-ride self.update() to alter the webservice ajax call or replace it with your own. (1) if sending additional
|
143
|
+
data that affects only the current widget, store it in a private variable and add it in update(). (2) if the additional
|
144
|
+
data affects all otherfacets, store it in the structure returned by self.state() and make sure the other widgets/webservices
|
145
|
+
can process it correctly.
|
146
|
+
|
147
|
+
|
148
|
+
Q. What Javascript OOP convention is this?
|
149
|
+
|
150
|
+
A. It's based on section 5.4, "Functional Inheritance" of Douglas Crockford, "Javascript: The Good Parts."
|
151
|
+
|
152
|
+
|
153
|
+
Q. Explain the naming conventions.
|
154
|
+
|
155
|
+
A. $foo is a jquery object, e.g. var $foo = $('.foo')
|
156
|
+
self is the object you're currently defining (as opposed to the one it inherits from, javascript's 'this', or its dom view)
|
157
|
+
|
158
|
+
|
159
|
+
Q. Why not support the metadata jquery plugin? Why not automatically turn all elements with a 'facet' class into facet widgets?
|
160
|
+
|
161
|
+
A. Possibly. It needs some thought.
|
data/INSTALL
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2009-2010 MIT Hyperstudio
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
4
|
+
obtaining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without
|
6
|
+
restriction, including without limitation the rights to use,
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the
|
9
|
+
Software is furnished to do so, subject to the following
|
10
|
+
conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
19
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
20
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|