1376 lines
61 KiB
HTML
1376 lines
61 KiB
HTML
<!DOCTYPE html>
|
||
|
||
<html>
|
||
<head>
|
||
<title>Recline Backbone Models</title>
|
||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
|
||
<link rel="stylesheet" media="all" href="docco.css" />
|
||
</head>
|
||
<body>
|
||
<div id="container">
|
||
<div id="background"></div>
|
||
|
||
<ul id="jump_to">
|
||
<li>
|
||
<a class="large" href="javascript:void(0);">Jump To …</a>
|
||
<a class="small" href="javascript:void(0);">+</a>
|
||
<div id="jump_wrapper">
|
||
<div id="jump_page_wrapper">
|
||
<div id="jump_page">
|
||
|
||
|
||
<a class="source" href="backend.dataproxy.html">
|
||
backend.dataproxy.js
|
||
</a>
|
||
|
||
|
||
<a class="source" href="backend.memory.html">
|
||
backend.memory.js
|
||
</a>
|
||
|
||
|
||
<a class="source" href="ecma-fixes.html">
|
||
ecma-fixes.js
|
||
</a>
|
||
|
||
|
||
<a class="source" href="model.html">
|
||
model.js
|
||
</a>
|
||
|
||
|
||
<a class="source" href="view.flot.html">
|
||
view.flot.js
|
||
</a>
|
||
|
||
|
||
<a class="source" href="view.graph.html">
|
||
view.graph.js
|
||
</a>
|
||
|
||
|
||
<a class="source" href="view.grid.html">
|
||
view.grid.js
|
||
</a>
|
||
|
||
|
||
<a class="source" href="view.map.html">
|
||
view.map.js
|
||
</a>
|
||
|
||
|
||
<a class="source" href="view.multiview.html">
|
||
view.multiview.js
|
||
</a>
|
||
|
||
|
||
<a class="source" href="view.slickgrid.html">
|
||
view.slickgrid.js
|
||
</a>
|
||
|
||
|
||
<a class="source" href="view.timeline.html">
|
||
view.timeline.js
|
||
</a>
|
||
|
||
|
||
<a class="source" href="widget.facetviewer.html">
|
||
widget.facetviewer.js
|
||
</a>
|
||
|
||
|
||
<a class="source" href="widget.fields.html">
|
||
widget.fields.js
|
||
</a>
|
||
|
||
|
||
<a class="source" href="widget.filtereditor.html">
|
||
widget.filtereditor.js
|
||
</a>
|
||
|
||
|
||
<a class="source" href="widget.pager.html">
|
||
widget.pager.js
|
||
</a>
|
||
|
||
|
||
<a class="source" href="widget.queryeditor.html">
|
||
widget.queryeditor.js
|
||
</a>
|
||
|
||
|
||
<a class="source" href="widget.valuefilter.html">
|
||
widget.valuefilter.js
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
|
||
<ul class="sections">
|
||
|
||
|
||
|
||
<li id="section-1">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-1">¶</a>
|
||
</div>
|
||
<h1 id="recline-backbone-models">Recline Backbone Models</h1>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">this</span>.recline = <span class="hljs-keyword">this</span>.recline || {};
|
||
<span class="hljs-keyword">this</span>.recline.Model = <span class="hljs-keyword">this</span>.recline.Model || {};
|
||
|
||
(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(my)</span> </span>{
|
||
<span class="hljs-pi"> "use strict"</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-2">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-2">¶</a>
|
||
</div>
|
||
<p>use either jQuery or Underscore Deferred depending on what is available</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> Deferred = (<span class="hljs-keyword">typeof</span> jQuery !== <span class="hljs-string">"undefined"</span> && jQuery.Deferred) || _.Deferred;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-3">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-3">¶</a>
|
||
</div>
|
||
<h2 id="-a-id-dataset-dataset-a-"><a id="dataset">Dataset</a></h2>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>my.Dataset = Backbone.Model.extend({
|
||
constructor: <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Dataset</span><span class="hljs-params">()</span> </span>{
|
||
Backbone.Model.prototype.constructor.apply(<span class="hljs-keyword">this</span>, <span class="hljs-built_in">arguments</span>);
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-4">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-4">¶</a>
|
||
</div>
|
||
<h3 id="initialize">initialize</h3>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> initialize: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> </span>{
|
||
<span class="hljs-keyword">var</span> self = <span class="hljs-keyword">this</span>;
|
||
_.bindAll(<span class="hljs-keyword">this</span>, <span class="hljs-string">'query'</span>);
|
||
<span class="hljs-keyword">this</span>.backend = <span class="hljs-literal">null</span>;
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.get(<span class="hljs-string">'backend'</span>)) {
|
||
<span class="hljs-keyword">this</span>.backend = <span class="hljs-keyword">this</span>._backendFromString(<span class="hljs-keyword">this</span>.get(<span class="hljs-string">'backend'</span>));
|
||
} <span class="hljs-keyword">else</span> { <span class="hljs-comment">// try to guess backend ...</span>
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.get(<span class="hljs-string">'records'</span>)) {
|
||
<span class="hljs-keyword">this</span>.backend = recline.Backend.Memory;
|
||
}
|
||
}
|
||
<span class="hljs-keyword">this</span>.fields = <span class="hljs-keyword">new</span> my.FieldList();
|
||
<span class="hljs-keyword">this</span>.records = <span class="hljs-keyword">new</span> my.RecordList();
|
||
<span class="hljs-keyword">this</span>._changes = {
|
||
deletes: [],
|
||
updates: [],
|
||
creates: []
|
||
};
|
||
<span class="hljs-keyword">this</span>.facets = <span class="hljs-keyword">new</span> my.FacetList();
|
||
<span class="hljs-keyword">this</span>.recordCount = <span class="hljs-literal">null</span>;
|
||
<span class="hljs-keyword">this</span>.queryState = <span class="hljs-keyword">new</span> my.Query();
|
||
<span class="hljs-keyword">this</span>.queryState.bind(<span class="hljs-string">'change facet:add'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">()</span> </span>{
|
||
self.query(); <span class="hljs-comment">// We want to call query() without any arguments.</span>
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-5">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-5">¶</a>
|
||
</div>
|
||
<p>store is what we query and save against
|
||
store will either be the backend or be a memory store if Backend fetch
|
||
tells us to use memory store</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">this</span>._store = <span class="hljs-keyword">this</span>.backend;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-6">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-6">¶</a>
|
||
</div>
|
||
<p>if backend has a handleQueryResultFunction, use that</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">this</span>._handleResult = (<span class="hljs-keyword">this</span>.backend != <span class="hljs-literal">null</span> && _.has(<span class="hljs-keyword">this</span>.backend, <span class="hljs-string">'handleQueryResult'</span>)) ?
|
||
<span class="hljs-keyword">this</span>.backend.handleQueryResult : <span class="hljs-keyword">this</span>._handleQueryResult;
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.backend == recline.Backend.Memory) {
|
||
<span class="hljs-keyword">this</span>.fetch();
|
||
}
|
||
},
|
||
|
||
sync: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(method, model, options)</span> </span>{
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.backend.sync(method, model, options);
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-7">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-7">¶</a>
|
||
</div>
|
||
<h3 id="fetch">fetch</h3>
|
||
<p>Retrieve dataset and (some) records from the backend.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> fetch: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> </span>{
|
||
<span class="hljs-keyword">var</span> self = <span class="hljs-keyword">this</span>;
|
||
<span class="hljs-keyword">var</span> dfd = <span class="hljs-keyword">new</span> Deferred();
|
||
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.backend !== recline.Backend.Memory) {
|
||
<span class="hljs-keyword">this</span>.backend.fetch(<span class="hljs-keyword">this</span>.toJSON())
|
||
.done(handleResults)
|
||
.fail(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(args)</span> </span>{
|
||
dfd.reject(args);
|
||
});
|
||
} <span class="hljs-keyword">else</span> {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-8">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-8">¶</a>
|
||
</div>
|
||
<p>special case where we have been given data directly</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> handleResults({
|
||
records: <span class="hljs-keyword">this</span>.get(<span class="hljs-string">'records'</span>),
|
||
fields: <span class="hljs-keyword">this</span>.get(<span class="hljs-string">'fields'</span>),
|
||
useMemoryStore: <span class="hljs-literal">true</span>
|
||
});
|
||
}
|
||
|
||
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">handleResults</span><span class="hljs-params">(results)</span> </span>{</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-9">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-9">¶</a>
|
||
</div>
|
||
<p>if explicitly given the fields
|
||
(e.g. var dataset = new Dataset({fields: fields, …})
|
||
use that field info over anything we get back by parsing the data
|
||
(results.fields)</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> fields = self.get(<span class="hljs-string">'fields'</span>) || results.fields;
|
||
|
||
<span class="hljs-keyword">var</span> out = self._normalizeRecordsAndFields(results.records, fields);
|
||
<span class="hljs-keyword">if</span> (results.useMemoryStore) {
|
||
self._store = <span class="hljs-keyword">new</span> recline.Backend.Memory.Store(out.records, out.fields);
|
||
}
|
||
|
||
self.set(results.metadata);
|
||
self.fields.reset(out.fields);
|
||
self.query()
|
||
.done(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> </span>{
|
||
dfd.resolve(self);
|
||
})
|
||
.fail(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(args)</span> </span>{
|
||
dfd.reject(args);
|
||
});
|
||
}
|
||
|
||
<span class="hljs-keyword">return</span> dfd.promise();
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-10">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-10">¶</a>
|
||
</div>
|
||
<h3 id="_normalizerecordsandfields">_normalizeRecordsAndFields</h3>
|
||
<p>Get a proper set of fields and records from incoming set of fields and records either of which may be null or arrays or objects</p>
|
||
<p>e.g. fields = [‘a’, ‘b’, ‘c’] and records = [ [1,2,3] ] =>
|
||
fields = [ {id: a}, {id: b}, {id: c}], records = [ {a: 1}, {b: 2}, {c: 3}]</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> _normalizeRecordsAndFields: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(records, fields)</span> </span>{</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-11">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-11">¶</a>
|
||
</div>
|
||
<p>if no fields get them from records</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (!fields && records && records.length > <span class="hljs-number">0</span>) {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-12">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-12">¶</a>
|
||
</div>
|
||
<p>records is array then fields is first row of records …</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (records[<span class="hljs-number">0</span>] <span class="hljs-keyword">instanceof</span> <span class="hljs-built_in">Array</span>) {
|
||
fields = records[<span class="hljs-number">0</span>];
|
||
records = records.slice(<span class="hljs-number">1</span>);
|
||
} <span class="hljs-keyword">else</span> {
|
||
fields = _.map(_.keys(records[<span class="hljs-number">0</span>]), <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(key)</span> </span>{
|
||
<span class="hljs-keyword">return</span> {id: key};
|
||
});
|
||
}
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-13">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-13">¶</a>
|
||
</div>
|
||
<p>fields is an array of strings (i.e. list of field headings/ids)</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (fields && fields.length > <span class="hljs-number">0</span> && (fields[<span class="hljs-number">0</span>] === <span class="hljs-literal">null</span> || <span class="hljs-keyword">typeof</span>(fields[<span class="hljs-number">0</span>]) != <span class="hljs-string">'object'</span>)) {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-14">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-14">¶</a>
|
||
</div>
|
||
<p>Rename duplicate fieldIds as each field name needs to be
|
||
unique.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> seen = {};
|
||
fields = _.map(fields, <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(field, index)</span> </span>{
|
||
<span class="hljs-keyword">if</span> (field === <span class="hljs-literal">null</span>) {
|
||
field = <span class="hljs-string">''</span>;
|
||
} <span class="hljs-keyword">else</span> {
|
||
field = field.toString();
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-15">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-15">¶</a>
|
||
</div>
|
||
<p>cannot use trim as not supported by IE7</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> fieldId = field.replace(<span class="hljs-regexp">/^\s+|\s+$/g</span>, <span class="hljs-string">''</span>);
|
||
<span class="hljs-keyword">if</span> (fieldId === <span class="hljs-string">''</span>) {
|
||
fieldId = <span class="hljs-string">'_noname_'</span>;
|
||
field = fieldId;
|
||
}
|
||
<span class="hljs-keyword">while</span> (fieldId <span class="hljs-keyword">in</span> seen) {
|
||
seen[field] += <span class="hljs-number">1</span>;
|
||
fieldId = field + seen[field];
|
||
}
|
||
<span class="hljs-keyword">if</span> (!(field <span class="hljs-keyword">in</span> seen)) {
|
||
seen[field] = <span class="hljs-number">0</span>;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-16">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-16">¶</a>
|
||
</div>
|
||
<p>TODO: decide whether to keep original name as label …
|
||
return { id: fieldId, label: field || fieldId }</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> { id: fieldId };
|
||
});
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-17">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-17">¶</a>
|
||
</div>
|
||
<p>records is provided as arrays so need to zip together with fields
|
||
NB: this requires you to have fields to match arrays</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (records && records.length > <span class="hljs-number">0</span> && records[<span class="hljs-number">0</span>] <span class="hljs-keyword">instanceof</span> <span class="hljs-built_in">Array</span>) {
|
||
records = _.map(records, <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(doc)</span> </span>{
|
||
<span class="hljs-keyword">var</span> tmp = {};
|
||
_.each(fields, <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(field, idx)</span> </span>{
|
||
tmp[field.id] = doc[idx];
|
||
});
|
||
<span class="hljs-keyword">return</span> tmp;
|
||
});
|
||
}
|
||
<span class="hljs-keyword">return</span> {
|
||
fields: fields,
|
||
records: records
|
||
};
|
||
},
|
||
|
||
save: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> </span>{
|
||
<span class="hljs-keyword">var</span> self = <span class="hljs-keyword">this</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-18">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-18">¶</a>
|
||
</div>
|
||
<p>TODO: need to reset the changes …</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>._store.save(<span class="hljs-keyword">this</span>._changes, <span class="hljs-keyword">this</span>.toJSON());
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-19">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-19">¶</a>
|
||
</div>
|
||
<h3 id="query">query</h3>
|
||
<p>AJAX method with promise API to get records from the backend.</p>
|
||
<p>It will query based on current query state (given by this.queryState)
|
||
updated by queryObj (if provided).</p>
|
||
<p>Resulting RecordList are used to reset this.records and are
|
||
also returned.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> query: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(queryObj)</span> </span>{
|
||
<span class="hljs-keyword">var</span> self = <span class="hljs-keyword">this</span>;
|
||
<span class="hljs-keyword">var</span> dfd = <span class="hljs-keyword">new</span> Deferred();
|
||
<span class="hljs-keyword">this</span>.trigger(<span class="hljs-string">'query:start'</span>);
|
||
|
||
<span class="hljs-keyword">if</span> (queryObj) {
|
||
<span class="hljs-keyword">var</span> attributes = queryObj;
|
||
<span class="hljs-keyword">if</span> (queryObj <span class="hljs-keyword">instanceof</span> my.Query) {
|
||
attributes = queryObj.toJSON();
|
||
}
|
||
<span class="hljs-keyword">this</span>.queryState.set(attributes, {silent: <span class="hljs-literal">true</span>});
|
||
}
|
||
<span class="hljs-keyword">var</span> actualQuery = <span class="hljs-keyword">this</span>.queryState.toJSON();
|
||
|
||
<span class="hljs-keyword">this</span>._store.query(actualQuery, <span class="hljs-keyword">this</span>.toJSON())
|
||
.done(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(queryResult)</span> </span>{
|
||
self._handleResult(queryResult);
|
||
self.trigger(<span class="hljs-string">'query:done'</span>);
|
||
dfd.resolve(self.records);
|
||
})
|
||
.fail(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(args)</span> </span>{
|
||
self.trigger(<span class="hljs-string">'query:fail'</span>, args);
|
||
dfd.reject(args);
|
||
});
|
||
<span class="hljs-keyword">return</span> dfd.promise();
|
||
},
|
||
|
||
_handleQueryResult: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(queryResult)</span> </span>{
|
||
<span class="hljs-keyword">var</span> self = <span class="hljs-keyword">this</span>;
|
||
self.recordCount = queryResult.total;
|
||
<span class="hljs-keyword">var</span> docs = _.map(queryResult.hits, <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(hit)</span> </span>{
|
||
<span class="hljs-keyword">var</span> _doc = <span class="hljs-keyword">new</span> my.Record(hit);
|
||
_doc.fields = self.fields;
|
||
_doc.bind(<span class="hljs-string">'change'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(doc)</span> </span>{
|
||
self._changes.updates.push(doc.toJSON());
|
||
});
|
||
_doc.bind(<span class="hljs-string">'destroy'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(doc)</span> </span>{
|
||
self._changes.deletes.push(doc.toJSON());
|
||
});
|
||
<span class="hljs-keyword">return</span> _doc;
|
||
});
|
||
self.records.reset(docs);
|
||
<span class="hljs-keyword">if</span> (queryResult.facets) {
|
||
<span class="hljs-keyword">var</span> facets = _.map(queryResult.facets, <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(facetResult, facetId)</span> </span>{
|
||
facetResult.id = facetId;
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> my.Facet(facetResult);
|
||
});
|
||
self.facets.reset(facets);
|
||
}
|
||
},
|
||
|
||
toTemplateJSON: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> </span>{
|
||
<span class="hljs-keyword">var</span> data = <span class="hljs-keyword">this</span>.toJSON();
|
||
data.recordCount = <span class="hljs-keyword">this</span>.recordCount;
|
||
data.fields = <span class="hljs-keyword">this</span>.fields.toJSON();
|
||
<span class="hljs-keyword">return</span> data;
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-20">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-20">¶</a>
|
||
</div>
|
||
<h3 id="getfieldssummary">getFieldsSummary</h3>
|
||
<p>Get a summary for each field in the form of a <code>Facet</code>.</p>
|
||
<p>@return null as this is async function. Provides deferred/promise interface.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> getFieldsSummary: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> </span>{
|
||
<span class="hljs-keyword">var</span> self = <span class="hljs-keyword">this</span>;
|
||
<span class="hljs-keyword">var</span> query = <span class="hljs-keyword">new</span> my.Query();
|
||
query.set({size: <span class="hljs-number">0</span>});
|
||
<span class="hljs-keyword">this</span>.fields.each(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(field)</span> </span>{
|
||
query.addFacet(field.id);
|
||
});
|
||
<span class="hljs-keyword">var</span> dfd = <span class="hljs-keyword">new</span> Deferred();
|
||
<span class="hljs-keyword">this</span>._store.query(query.toJSON(), <span class="hljs-keyword">this</span>.toJSON()).done(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(queryResult)</span> </span>{
|
||
<span class="hljs-keyword">if</span> (queryResult.facets) {
|
||
_.each(queryResult.facets, <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(facetResult, facetId)</span> </span>{
|
||
facetResult.id = facetId;
|
||
<span class="hljs-keyword">var</span> facet = <span class="hljs-keyword">new</span> my.Facet(facetResult);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-21">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-21">¶</a>
|
||
</div>
|
||
<p>TODO: probably want replace rather than reset (i.e. just replace the facet with this id)</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> self.fields.get(facetId).facets.reset(facet);
|
||
});
|
||
}
|
||
dfd.resolve(queryResult);
|
||
});
|
||
<span class="hljs-keyword">return</span> dfd.promise();
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-22">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-22">¶</a>
|
||
</div>
|
||
<p>Deprecated (as of v0.5) - use record.summary()</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> recordSummary: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(record)</span> </span>{
|
||
<span class="hljs-keyword">return</span> record.summary();
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-23">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-23">¶</a>
|
||
</div>
|
||
<h3 id="_backendfromstring-backendstring-">_backendFromString(backendString)</h3>
|
||
<p>Look up a backend module from a backend string (look in recline.Backend)</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> _backendFromString: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(backendString)</span> </span>{
|
||
<span class="hljs-keyword">var</span> backend = <span class="hljs-literal">null</span>;
|
||
<span class="hljs-keyword">if</span> (recline && recline.Backend) {
|
||
_.each(_.keys(recline.Backend), <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(name)</span> </span>{
|
||
<span class="hljs-keyword">if</span> (name.toLowerCase() === backendString.toLowerCase()) {
|
||
backend = recline.Backend[name];
|
||
}
|
||
});
|
||
}
|
||
<span class="hljs-keyword">return</span> backend;
|
||
}
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-24">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-24">¶</a>
|
||
</div>
|
||
<h2 id="-a-id-record-a-record-a-"><a id="record">A Record</a></h2>
|
||
<p>A single record (or row) in the dataset</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>my.Record = Backbone.Model.extend({
|
||
constructor: <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Record</span><span class="hljs-params">()</span> </span>{
|
||
Backbone.Model.prototype.constructor.apply(<span class="hljs-keyword">this</span>, <span class="hljs-built_in">arguments</span>);
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-25">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-25">¶</a>
|
||
</div>
|
||
<h3 id="initialize">initialize</h3>
|
||
<p>Create a Record</p>
|
||
<p>You usually will not do this directly but will have records created by
|
||
Dataset e.g. in query method</p>
|
||
<p>Certain methods require presence of a fields attribute (identical to that on Dataset)</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> initialize: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> </span>{
|
||
_.bindAll(<span class="hljs-keyword">this</span>, <span class="hljs-string">'getFieldValue'</span>);
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-26">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-26">¶</a>
|
||
</div>
|
||
<h3 id="getfieldvalue">getFieldValue</h3>
|
||
<p>For the provided Field get the corresponding rendered computed data value
|
||
for this record.</p>
|
||
<p>NB: if field is undefined a default ‘’ value will be returned</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> getFieldValue: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(field)</span> </span>{
|
||
<span class="hljs-keyword">var</span> val = <span class="hljs-keyword">this</span>.getFieldValueUnrendered(field);
|
||
<span class="hljs-keyword">if</span> (field && !_.isUndefined(field.renderer)) {
|
||
val = field.renderer(val, field, <span class="hljs-keyword">this</span>.toJSON());
|
||
}
|
||
<span class="hljs-keyword">return</span> val;
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-27">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-27">¶</a>
|
||
</div>
|
||
<h3 id="getfieldvalueunrendered">getFieldValueUnrendered</h3>
|
||
<p>For the provided Field get the corresponding computed data value
|
||
for this record.</p>
|
||
<p>NB: if field is undefined a default ‘’ value will be returned</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> getFieldValueUnrendered: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(field)</span> </span>{
|
||
<span class="hljs-keyword">if</span> (!field) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-string">''</span>;
|
||
}
|
||
<span class="hljs-keyword">var</span> val = <span class="hljs-keyword">this</span>.get(field.id);
|
||
<span class="hljs-keyword">if</span> (field.deriver) {
|
||
val = field.deriver(val, field, <span class="hljs-keyword">this</span>);
|
||
}
|
||
<span class="hljs-keyword">return</span> val;
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-28">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-28">¶</a>
|
||
</div>
|
||
<h3 id="summary">summary</h3>
|
||
<p>Get a simple html summary of this record in form of key/value list</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> summary: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(record)</span> </span>{
|
||
<span class="hljs-keyword">var</span> self = <span class="hljs-keyword">this</span>;
|
||
<span class="hljs-keyword">var</span> html = <span class="hljs-string">'<div class="recline-record-summary">'</span>;
|
||
<span class="hljs-keyword">this</span>.fields.each(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(field)</span> </span>{
|
||
<span class="hljs-keyword">if</span> (field.id != <span class="hljs-string">'id'</span>) {
|
||
html += <span class="hljs-string">'<div class="'</span> + field.id + <span class="hljs-string">'"><strong>'</span> + field.get(<span class="hljs-string">'label'</span>) + <span class="hljs-string">'</strong>: '</span> + self.getFieldValue(field) + <span class="hljs-string">'</div>'</span>;
|
||
}
|
||
});
|
||
html += <span class="hljs-string">'</div>'</span>;
|
||
<span class="hljs-keyword">return</span> html;
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-29">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-29">¶</a>
|
||
</div>
|
||
<p>Override Backbone save, fetch and destroy so they do nothing
|
||
Instead, Dataset object that created this Record should take care of
|
||
handling these changes (discovery will occur via event notifications)
|
||
WARNING: these will not persist <em>unless</em> you call save on Dataset</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> fetch: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> </span>{},
|
||
save: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> </span>{},
|
||
destroy: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> </span>{ <span class="hljs-keyword">this</span>.trigger(<span class="hljs-string">'destroy'</span>, <span class="hljs-keyword">this</span>); }
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-30">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-30">¶</a>
|
||
</div>
|
||
<h2 id="a-backbone-collection-of-records">A Backbone collection of Records</h2>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>my.RecordList = Backbone.Collection.extend({
|
||
constructor: <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">RecordList</span><span class="hljs-params">()</span> </span>{
|
||
Backbone.Collection.prototype.constructor.apply(<span class="hljs-keyword">this</span>, <span class="hljs-built_in">arguments</span>);
|
||
},
|
||
model: my.Record
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-31">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-31">¶</a>
|
||
</div>
|
||
<h2 id="-a-id-field-a-field-aka-column-on-a-dataset-a-"><a id="field">A Field (aka Column) on a Dataset</a></h2>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>my.Field = Backbone.Model.extend({
|
||
constructor: <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Field</span><span class="hljs-params">()</span> </span>{
|
||
Backbone.Model.prototype.constructor.apply(<span class="hljs-keyword">this</span>, <span class="hljs-built_in">arguments</span>);
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-32">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-32">¶</a>
|
||
</div>
|
||
<h3 id="defaults-define-default-values">defaults - define default values</h3>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> defaults: {
|
||
label: <span class="hljs-literal">null</span>,
|
||
type: <span class="hljs-string">'string'</span>,
|
||
format: <span class="hljs-literal">null</span>,
|
||
is_derived: <span class="hljs-literal">false</span>
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-33">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-33">¶</a>
|
||
</div>
|
||
<h3 id="initialize">initialize</h3>
|
||
<p>@param {Object} data: standard Backbone model attributes</p>
|
||
<p>@param {Object} options: renderer and/or deriver functions.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> initialize: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(data, options)</span> </span>{</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-34">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-34">¶</a>
|
||
</div>
|
||
<p>if a hash not passed in the first argument throw error</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (<span class="hljs-string">'0'</span> <span class="hljs-keyword">in</span> data) {
|
||
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">'Looks like you did not pass a proper hash with id to Field constructor'</span>);
|
||
}
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.attributes.label === <span class="hljs-literal">null</span>) {
|
||
<span class="hljs-keyword">this</span>.set({label: <span class="hljs-keyword">this</span>.id});
|
||
}
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.attributes.type.toLowerCase() <span class="hljs-keyword">in</span> <span class="hljs-keyword">this</span>._typeMap) {
|
||
<span class="hljs-keyword">this</span>.attributes.type = <span class="hljs-keyword">this</span>._typeMap[<span class="hljs-keyword">this</span>.attributes.type.toLowerCase()];
|
||
}
|
||
<span class="hljs-keyword">if</span> (options) {
|
||
<span class="hljs-keyword">this</span>.renderer = options.renderer;
|
||
<span class="hljs-keyword">this</span>.deriver = options.deriver;
|
||
}
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-keyword">this</span>.renderer) {
|
||
<span class="hljs-keyword">this</span>.renderer = <span class="hljs-keyword">this</span>.defaultRenderers[<span class="hljs-keyword">this</span>.get(<span class="hljs-string">'type'</span>)];
|
||
}
|
||
<span class="hljs-keyword">this</span>.facets = <span class="hljs-keyword">new</span> my.FacetList();
|
||
},
|
||
_typeMap: {
|
||
<span class="hljs-string">'text'</span>: <span class="hljs-string">'string'</span>,
|
||
<span class="hljs-string">'double'</span>: <span class="hljs-string">'number'</span>,
|
||
<span class="hljs-string">'float'</span>: <span class="hljs-string">'number'</span>,
|
||
<span class="hljs-string">'numeric'</span>: <span class="hljs-string">'number'</span>,
|
||
<span class="hljs-string">'int'</span>: <span class="hljs-string">'integer'</span>,
|
||
<span class="hljs-string">'datetime'</span>: <span class="hljs-string">'date-time'</span>,
|
||
<span class="hljs-string">'bool'</span>: <span class="hljs-string">'boolean'</span>,
|
||
<span class="hljs-string">'timestamp'</span>: <span class="hljs-string">'date-time'</span>,
|
||
<span class="hljs-string">'json'</span>: <span class="hljs-string">'object'</span>
|
||
},
|
||
defaultRenderers: {
|
||
object: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(val, field, doc)</span> </span>{
|
||
<span class="hljs-keyword">return</span> <span class="hljs-built_in">JSON</span>.stringify(val);
|
||
},
|
||
geo_point: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(val, field, doc)</span> </span>{
|
||
<span class="hljs-keyword">return</span> <span class="hljs-built_in">JSON</span>.stringify(val);
|
||
},
|
||
<span class="hljs-string">'number'</span>: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(val, field, doc)</span> </span>{
|
||
<span class="hljs-keyword">var</span> format = field.get(<span class="hljs-string">'format'</span>);
|
||
<span class="hljs-keyword">if</span> (format === <span class="hljs-string">'percentage'</span>) {
|
||
<span class="hljs-keyword">return</span> val + <span class="hljs-string">'%'</span>;
|
||
}
|
||
<span class="hljs-keyword">return</span> val;
|
||
},
|
||
<span class="hljs-string">'string'</span>: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(val, field, doc)</span> </span>{
|
||
<span class="hljs-keyword">var</span> format = field.get(<span class="hljs-string">'format'</span>);
|
||
<span class="hljs-keyword">if</span> (format === <span class="hljs-string">'markdown'</span>) {
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> Showdown !== <span class="hljs-string">'undefined'</span>) {
|
||
<span class="hljs-keyword">var</span> showdown = <span class="hljs-keyword">new</span> Showdown.converter();
|
||
out = showdown.makeHtml(val);
|
||
<span class="hljs-keyword">return</span> out;
|
||
} <span class="hljs-keyword">else</span> {
|
||
<span class="hljs-keyword">return</span> val;
|
||
}
|
||
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (format == <span class="hljs-string">'plain'</span>) {
|
||
<span class="hljs-keyword">return</span> val;
|
||
} <span class="hljs-keyword">else</span> {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-35">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-35">¶</a>
|
||
</div>
|
||
<p>as this is the default and default type is string may get things
|
||
here that are not actually strings</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (val && <span class="hljs-keyword">typeof</span> val === <span class="hljs-string">'string'</span>) {
|
||
val = val.replace(<span class="hljs-regexp">/(https?:\/\/[^ ]+)/g</span>, <span class="hljs-string">'<a href="$1">$1</a>'</span>);
|
||
}
|
||
<span class="hljs-keyword">return</span> val;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
my.FieldList = Backbone.Collection.extend({
|
||
constructor: <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">FieldList</span><span class="hljs-params">()</span> </span>{
|
||
Backbone.Collection.prototype.constructor.apply(<span class="hljs-keyword">this</span>, <span class="hljs-built_in">arguments</span>);
|
||
},
|
||
model: my.Field
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-36">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-36">¶</a>
|
||
</div>
|
||
<h2 id="-a-id-query-query-a-"><a id="query">Query</a></h2>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>my.Query = Backbone.Model.extend({
|
||
constructor: <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Query</span><span class="hljs-params">()</span> </span>{
|
||
Backbone.Model.prototype.constructor.apply(<span class="hljs-keyword">this</span>, <span class="hljs-built_in">arguments</span>);
|
||
},
|
||
defaults: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> </span>{
|
||
<span class="hljs-keyword">return</span> {
|
||
size: <span class="hljs-number">100</span>,
|
||
from: <span class="hljs-number">0</span>,
|
||
q: <span class="hljs-string">''</span>,
|
||
facets: {},
|
||
filters: []
|
||
};
|
||
},
|
||
_filterTemplates: {
|
||
term: {
|
||
type: <span class="hljs-string">'term'</span>,</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-37">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-37">¶</a>
|
||
</div>
|
||
<p>TODO do we need this attribute here?</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> field: <span class="hljs-string">''</span>,
|
||
term: <span class="hljs-string">''</span>
|
||
},
|
||
range: {
|
||
type: <span class="hljs-string">'range'</span>,
|
||
from: <span class="hljs-string">''</span>,
|
||
to: <span class="hljs-string">''</span>
|
||
},
|
||
geo_distance: {
|
||
type: <span class="hljs-string">'geo_distance'</span>,
|
||
distance: <span class="hljs-number">10</span>,
|
||
unit: <span class="hljs-string">'km'</span>,
|
||
point: {
|
||
lon: <span class="hljs-number">0</span>,
|
||
lat: <span class="hljs-number">0</span>
|
||
}
|
||
}
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-38">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-38">¶</a>
|
||
</div>
|
||
<h3 id="addfilter-filter-">addFilter(filter)</h3>
|
||
<p>Add a new filter specified by the filter hash and append to the list of filters</p>
|
||
<p>@param filter an object specifying the filter - see _filterTemplates for examples. If only type is provided will generate a filter by cloning _filterTemplates</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> addFilter: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(filter)</span> </span>{</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-39">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-39">¶</a>
|
||
</div>
|
||
<p>crude deep copy</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> ourfilter = <span class="hljs-built_in">JSON</span>.parse(<span class="hljs-built_in">JSON</span>.stringify(filter));</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-40">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-40">¶</a>
|
||
</div>
|
||
<p>not fully specified so use template and over-write</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (_.keys(filter).length <= <span class="hljs-number">3</span>) {
|
||
ourfilter = _.defaults(ourfilter, <span class="hljs-keyword">this</span>._filterTemplates[filter.type]);
|
||
}
|
||
<span class="hljs-keyword">var</span> filters = <span class="hljs-keyword">this</span>.get(<span class="hljs-string">'filters'</span>);
|
||
filters.push(ourfilter);
|
||
<span class="hljs-keyword">this</span>.trigger(<span class="hljs-string">'change:filters:new-blank'</span>);
|
||
},
|
||
replaceFilter: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(filter)</span> </span>{</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-41">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-41">¶</a>
|
||
</div>
|
||
<p>delete filter on the same field, then add</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> filters = <span class="hljs-keyword">this</span>.get(<span class="hljs-string">'filters'</span>);
|
||
<span class="hljs-keyword">var</span> idx = -<span class="hljs-number">1</span>;
|
||
_.each(<span class="hljs-keyword">this</span>.get(<span class="hljs-string">'filters'</span>), <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(f, key, list)</span> </span>{
|
||
<span class="hljs-keyword">if</span> (filter.field == f.field) {
|
||
idx = key;
|
||
}
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-42">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-42">¶</a>
|
||
</div>
|
||
<p>trigger just one event (change:filters:new-blank) instead of one for remove and
|
||
one for add</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (idx >= <span class="hljs-number">0</span>) {
|
||
filters.splice(idx, <span class="hljs-number">1</span>);
|
||
<span class="hljs-keyword">this</span>.set({filters: filters});
|
||
}
|
||
<span class="hljs-keyword">this</span>.addFilter(filter);
|
||
},
|
||
updateFilter: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(index, value)</span> </span>{
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-43">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-43">¶</a>
|
||
</div>
|
||
<h3 id="removefilter">removeFilter</h3>
|
||
<p>Remove a filter from filters at index filterIndex</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> removeFilter: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(filterIndex)</span> </span>{
|
||
<span class="hljs-keyword">var</span> filters = <span class="hljs-keyword">this</span>.get(<span class="hljs-string">'filters'</span>);
|
||
filters.splice(filterIndex, <span class="hljs-number">1</span>);
|
||
<span class="hljs-keyword">this</span>.set({filters: filters});
|
||
<span class="hljs-keyword">this</span>.trigger(<span class="hljs-string">'change'</span>);
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-44">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-44">¶</a>
|
||
</div>
|
||
<h3 id="addfacet">addFacet</h3>
|
||
<p>Add a Facet to this query</p>
|
||
<p>See <a href="http://www.elasticsearch.org/guide/reference/api/search/facets/">http://www.elasticsearch.org/guide/reference/api/search/facets/</a></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> addFacet: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(fieldId, size, silent)</span> </span>{
|
||
<span class="hljs-keyword">var</span> facets = <span class="hljs-keyword">this</span>.get(<span class="hljs-string">'facets'</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-45">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-45">¶</a>
|
||
</div>
|
||
<p>Assume id and fieldId should be the same (TODO: this need not be true if we want to add two different type of facets on same field)</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (_.contains(_.keys(facets), fieldId)) {
|
||
<span class="hljs-keyword">return</span>;
|
||
}
|
||
facets[fieldId] = {
|
||
terms: { field: fieldId }
|
||
};
|
||
<span class="hljs-keyword">if</span> (!_.isUndefined(size)) {
|
||
facets[fieldId].terms.size = size;
|
||
}
|
||
<span class="hljs-keyword">this</span>.set({facets: facets}, {silent: <span class="hljs-literal">true</span>});
|
||
<span class="hljs-keyword">if</span> (!silent) {
|
||
<span class="hljs-keyword">this</span>.trigger(<span class="hljs-string">'facet:add'</span>, <span class="hljs-keyword">this</span>);
|
||
}
|
||
},
|
||
addHistogramFacet: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(fieldId)</span> </span>{
|
||
<span class="hljs-keyword">var</span> facets = <span class="hljs-keyword">this</span>.get(<span class="hljs-string">'facets'</span>);
|
||
facets[fieldId] = {
|
||
date_histogram: {
|
||
field: fieldId,
|
||
interval: <span class="hljs-string">'day'</span>
|
||
}
|
||
};
|
||
<span class="hljs-keyword">this</span>.set({facets: facets}, {silent: <span class="hljs-literal">true</span>});
|
||
<span class="hljs-keyword">this</span>.trigger(<span class="hljs-string">'facet:add'</span>, <span class="hljs-keyword">this</span>);
|
||
},
|
||
removeFacet: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(fieldId)</span> </span>{
|
||
<span class="hljs-keyword">var</span> facets = <span class="hljs-keyword">this</span>.get(<span class="hljs-string">'facets'</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-46">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-46">¶</a>
|
||
</div>
|
||
<p>Assume id and fieldId should be the same (TODO: this need not be true if we want to add two different type of facets on same field)</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (!_.contains(_.keys(facets), fieldId)) {
|
||
<span class="hljs-keyword">return</span>;
|
||
}
|
||
<span class="hljs-keyword">delete</span> facets[fieldId];
|
||
<span class="hljs-keyword">this</span>.set({facets: facets}, {silent: <span class="hljs-literal">true</span>});
|
||
<span class="hljs-keyword">this</span>.trigger(<span class="hljs-string">'facet:remove'</span>, <span class="hljs-keyword">this</span>);
|
||
},
|
||
clearFacets: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> </span>{
|
||
<span class="hljs-keyword">var</span> facets = <span class="hljs-keyword">this</span>.get(<span class="hljs-string">'facets'</span>);
|
||
_.each(_.keys(facets), <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(fieldId)</span> </span>{
|
||
<span class="hljs-keyword">delete</span> facets[fieldId];
|
||
});
|
||
<span class="hljs-keyword">this</span>.trigger(<span class="hljs-string">'facet:remove'</span>, <span class="hljs-keyword">this</span>);
|
||
},</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-47">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-47">¶</a>
|
||
</div>
|
||
<p>trigger a facet add; use this to trigger a single event after adding
|
||
multiple facets</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> refreshFacets: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> </span>{
|
||
<span class="hljs-keyword">this</span>.trigger(<span class="hljs-string">'facet:add'</span>, <span class="hljs-keyword">this</span>);
|
||
}
|
||
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-48">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-48">¶</a>
|
||
</div>
|
||
<h2 id="-a-id-facet-a-facet-result-a-"><a id="facet">A Facet (Result)</a></h2>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>my.Facet = Backbone.Model.extend({
|
||
constructor: <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Facet</span><span class="hljs-params">()</span> </span>{
|
||
Backbone.Model.prototype.constructor.apply(<span class="hljs-keyword">this</span>, <span class="hljs-built_in">arguments</span>);
|
||
},
|
||
defaults: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> </span>{
|
||
<span class="hljs-keyword">return</span> {
|
||
_type: <span class="hljs-string">'terms'</span>,
|
||
total: <span class="hljs-number">0</span>,
|
||
other: <span class="hljs-number">0</span>,
|
||
missing: <span class="hljs-number">0</span>,
|
||
terms: []
|
||
};
|
||
}
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-49">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-49">¶</a>
|
||
</div>
|
||
<h2 id="a-collection-list-of-facets">A Collection/List of Facets</h2>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>my.FacetList = Backbone.Collection.extend({
|
||
constructor: <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">FacetList</span><span class="hljs-params">()</span> </span>{
|
||
Backbone.Collection.prototype.constructor.apply(<span class="hljs-keyword">this</span>, <span class="hljs-built_in">arguments</span>);
|
||
},
|
||
model: my.Facet
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-50">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-50">¶</a>
|
||
</div>
|
||
<h2 id="object-state">Object State</h2>
|
||
<p>Convenience Backbone model for storing (configuration) state of objects like Views.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>my.ObjectState = Backbone.Model.extend({
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-51">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-51">¶</a>
|
||
</div>
|
||
<h2 id="backbone-sync">Backbone.sync</h2>
|
||
<p>Override Backbone.sync to hand off to sync function in relevant backend
|
||
Backbone.sync = function(method, model, options) {
|
||
return model.backend.sync(method, model, options);
|
||
};</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>
|
||
}(<span class="hljs-keyword">this</span>.recline.Model));</pre></div></div>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
</body>
|
||
</html>
|