<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>jIO Complex Queries — jIO 2.0.0 documentation</title> <link rel="stylesheet" href="_static/default.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '', VERSION: '2.0.0', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> <link rel="top" title="jIO 2.0.0 documentation" href="index.html" /> <link rel="next" title="Metadata" href="metadata.html" /> <link rel="prev" title="jIO GIDStorage" href="gid_storage.html" /> </head> <body> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="genindex.html" title="General Index" accesskey="I">index</a></li> <li class="right" > <a href="metadata.html" title="Metadata" accesskey="N">next</a> |</li> <li class="right" > <a href="gid_storage.html" title="jIO GIDStorage" accesskey="P">previous</a> |</li> <li><a href="index.html">jIO 2.0.0 documentation</a> »</li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <div class="section" id="jio-complex-queries"> <h1>jIO Complex Queries<a class="headerlink" href="#jio-complex-queries" title="Permalink to this headline">¶</a></h1> <div class="section" id="what-are-complex-queries"> <h2>What are Complex Queries?<a class="headerlink" href="#what-are-complex-queries" title="Permalink to this headline">¶</a></h2> <p>In jIO, a complex query can ask a storage server to select, filter, sort, or limit a document list before sending it back. If the server is not able to do so, the complex query tool can act on the retreived list by itself. Only the <tt class="docutils literal"><span class="pre">allDocs()</span></tt> method can use complex queries.</p> <p>A query can either be a string (using a specific language useful for writing queries), or it can be a tree of objects (useful to browse queries). To handle complex queries, jIO uses a parsed grammar file which is compiled using <a class="reference external" href="http://jscc.phorward-software.com/">JSCC</a>.</p> </div> <div class="section" id="why-use-complex-queries"> <h2>Why use Complex Queries?<a class="headerlink" href="#why-use-complex-queries" title="Permalink to this headline">¶</a></h2> <p>Complex queries can be used like database queries, for tasks such as:</p> <ul class="simple"> <li>search a specific document</li> <li>sort a list of documents in a certain order</li> <li>avoid retrieving a list of ten thousand documents</li> <li>limit the list to show only N documents per page</li> </ul> <p>For some storages (like localStorage), complex queries can be a powerful tool to query accessible documents. When querying documents on a distant storage, some server-side logic should be run to avoid having to request large amount of documents to run a query on the client. If distant storages are static, an alternative would be to use an indexStorage with appropriate indices as complex queries will always try to run the query on the index before querying documents itself.</p> </div> <div class="section" id="how-to-use-complex-queries-with-jio"> <h2>How to use Complex Queries with jIO?<a class="headerlink" href="#how-to-use-complex-queries-with-jio" title="Permalink to this headline">¶</a></h2> <p>Complex queries can be triggered by including the option named query in the <tt class="docutils literal"><span class="pre">allDocs()</span></tt> method call.</p> <p>Example:</p> <div class="highlight-javascript"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">options</span> <span class="o">=</span> <span class="p">{};</span> <span class="c1">// search text query</span> <span class="nx">options</span><span class="p">[</span><span class="s1">'query'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'(creator:"John Doe") AND (format:"pdf")'</span><span class="p">;</span> <span class="c1">// OR query tree</span> <span class="nx">options</span><span class="p">[</span><span class="s1">'query'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span><span class="s1">'complex'</span><span class="p">,</span> <span class="nx">operator</span><span class="o">:</span><span class="s1">'AND'</span><span class="p">,</span> <span class="nx">query_list</span><span class="o">:</span> <span class="p">[{</span> <span class="s2">"type"</span><span class="o">:</span> <span class="s2">"simple"</span><span class="p">,</span> <span class="s2">"key"</span><span class="o">:</span> <span class="s2">"creator"</span><span class="p">,</span> <span class="s2">"value"</span><span class="o">:</span> <span class="s2">"John Doe"</span> <span class="p">},</span> <span class="p">{</span> <span class="s2">"type"</span><span class="o">:</span> <span class="s2">"simple"</span><span class="p">,</span> <span class="s2">"key"</span><span class="o">:</span> <span class="s2">"format"</span><span class="p">,</span> <span class="s2">"value"</span><span class="o">:</span> <span class="s2">"pdf"</span> <span class="p">}]</span> <span class="p">};</span> <span class="c1">// FULL example using filtering criteria</span> <span class="nx">options</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">query</span><span class="o">:</span> <span class="s1">'(creator:"% Doe") AND (format:"pdf")'</span><span class="p">,</span> <span class="nx">limit</span><span class="o">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span> <span class="nx">sort_on</span><span class="o">:</span> <span class="p">[[</span><span class="s1">'last_modified'</span><span class="p">,</span> <span class="s1">'descending'</span><span class="p">],</span> <span class="p">[</span><span class="s1">'creation_date'</span><span class="p">,</span> <span class="s1">'descending'</span><span class="p">]],</span> <span class="nx">select_list</span><span class="o">:</span> <span class="p">[</span><span class="s1">'title'</span><span class="p">],</span> <span class="nx">wildcard_character</span><span class="o">:</span> <span class="s1">'%'</span> <span class="p">};</span> <span class="c1">// execution</span> <span class="nx">jio_instance</span><span class="p">.</span><span class="nx">allDocs</span><span class="p">(</span><span class="nx">options</span><span class="p">,</span> <span class="nx">callback</span><span class="p">);</span> </pre></div> </div> </div> <div class="section" id="how-to-use-complex-queries-outside-jio"> <h2>How to use Complex Queries outside jIO?<a class="headerlink" href="#how-to-use-complex-queries-outside-jio" title="Permalink to this headline">¶</a></h2> <p>Complex Queries provides an API - which namespace is complex_queries. Refer to the <a class="reference external" href="http://git.erp5.org/gitweb/jio.git/blob/HEAD:/examples/complex_example.html?js=1">Complex Queries sample page</a> for how to use these methods, in and outside jIO. The module provides:</p> <div class="highlight-javascript"><div class="highlight"><pre><span class="p">{</span> <span class="nx">parseStringToObject</span><span class="o">:</span> <span class="p">[</span><span class="nb">Function</span><span class="o">:</span> <span class="nx">parseStringToObject</span><span class="p">],</span> <span class="nx">stringEscapeRegexpCharacters</span><span class="o">:</span> <span class="p">[</span><span class="nb">Function</span><span class="o">:</span> <span class="nx">stringEscapeRegexpCharacters</span><span class="p">],</span> <span class="nx">select</span><span class="o">:</span> <span class="p">[</span><span class="nb">Function</span><span class="o">:</span> <span class="nx">select</span><span class="p">],</span> <span class="nx">sortOn</span><span class="o">:</span> <span class="p">[</span><span class="nb">Function</span><span class="o">:</span> <span class="nx">sortOn</span><span class="p">],</span> <span class="nx">limit</span><span class="o">:</span> <span class="p">[</span><span class="nb">Function</span><span class="o">:</span> <span class="nx">limit</span><span class="p">],</span> <span class="nx">convertStringToRegExp</span><span class="o">:</span> <span class="p">[</span><span class="nb">Function</span><span class="o">:</span> <span class="nx">convertStringToRegExp</span><span class="p">],</span> <span class="nx">QueryFactory</span><span class="o">:</span> <span class="p">{</span> <span class="p">[</span><span class="nb">Function</span><span class="o">:</span> <span class="nx">QueryFactory</span><span class="p">]</span> <span class="nx">create</span><span class="o">:</span> <span class="p">[</span><span class="nb">Function</span><span class="p">]</span> <span class="p">},</span> <span class="nx">Query</span><span class="o">:</span> <span class="p">[</span><span class="nb">Function</span><span class="o">:</span> <span class="nx">Query</span><span class="p">],</span> <span class="nx">SimpleQuery</span><span class="o">:</span> <span class="p">{</span> <span class="p">[</span><span class="nb">Function</span><span class="o">:</span> <span class="nx">SimpleQuery</span><span class="p">]</span> <span class="nx">super_</span><span class="o">:</span> <span class="p">[</span><span class="nb">Function</span><span class="o">:</span> <span class="nx">Query</span><span class="p">]</span> <span class="p">},</span> <span class="nx">ComplexQuery</span><span class="o">:</span> <span class="p">{</span> <span class="p">[</span><span class="nb">Function</span><span class="o">:</span> <span class="nx">ComplexQuery</span><span class="p">]</span> <span class="nx">super_</span><span class="o">:</span> <span class="p">[</span><span class="nb">Function</span><span class="o">:</span> <span class="nx">Query</span><span class="p">]</span> <span class="p">}</span> <span class="p">}</span> </pre></div> </div> <p>(Reference API coming soon.)</p> <p>Basic example:</p> <div class="highlight-javascript"><div class="highlight"><pre><span class="c1">// object list (generated from documents in storage or index)</span> <span class="kd">var</span> <span class="nx">object_list</span> <span class="o">=</span> <span class="p">[</span> <span class="p">{</span><span class="s2">"title"</span><span class="o">:</span> <span class="s2">"Document number 1"</span><span class="p">,</span> <span class="s2">"creator"</span><span class="o">:</span> <span class="s2">"John Doe"</span><span class="p">},</span> <span class="p">{</span><span class="s2">"title"</span><span class="o">:</span> <span class="s2">"Document number 2"</span><span class="p">,</span> <span class="s2">"creator"</span><span class="o">:</span> <span class="s2">"James Bond"</span><span class="p">}</span> <span class="p">];</span> <span class="c1">// the query to run</span> <span class="kd">var</span> <span class="nx">query</span> <span class="o">=</span> <span class="s1">'title: "Document number 1"'</span><span class="p">;</span> <span class="c1">// running the query</span> <span class="kd">var</span> <span class="nx">result</span> <span class="o">=</span> <span class="nx">complex_queries</span><span class="p">.</span><span class="nx">QueryFactory</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">query</span><span class="p">).</span><span class="nx">exec</span><span class="p">(</span><span class="nx">object_list</span><span class="p">);</span> <span class="c1">// console.log(result);</span> <span class="c1">// [ { "title": "Document number 1", "creator": "John Doe"} ]</span> </pre></div> </div> <p>Other example:</p> <div class="highlight-javascript"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">result</span> <span class="o">=</span> <span class="nx">complex_queries</span><span class="p">.</span><span class="nx">QueryFactory</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">query</span><span class="p">).</span><span class="nx">exec</span><span class="p">(</span> <span class="nx">object_list</span><span class="p">,</span> <span class="p">{</span> <span class="s2">"select"</span><span class="o">:</span> <span class="p">[</span><span class="s1">'title'</span><span class="p">,</span> <span class="s1">'year'</span><span class="p">],</span> <span class="s2">"limit"</span><span class="o">:</span> <span class="p">[</span><span class="mi">20</span><span class="p">,</span> <span class="mi">20</span><span class="p">],</span> <span class="c1">// from 20th to 40th document</span> <span class="s2">"sort_on"</span><span class="o">:</span> <span class="p">[[</span><span class="s1">'title'</span><span class="p">,</span> <span class="s1">'ascending'</span><span class="p">],</span> <span class="p">[</span><span class="s1">'year'</span><span class="p">,</span> <span class="s1">'descending'</span><span class="p">]],</span> <span class="s2">"other_keys_and_values"</span><span class="o">:</span> <span class="s2">"are_ignored"</span> <span class="p">}</span> <span class="p">);</span> <span class="c1">// this case is equal to:</span> <span class="kd">var</span> <span class="nx">result</span> <span class="o">=</span> <span class="nx">complex_queries</span><span class="p">.</span><span class="nx">QueryFactory</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">query</span><span class="p">).</span><span class="nx">exec</span><span class="p">(</span><span class="nx">object_list</span><span class="p">);</span> <span class="nx">complex_queries</span><span class="p">.</span><span class="nx">sortOn</span><span class="p">([[</span><span class="s1">'title'</span><span class="p">,</span> <span class="s1">'ascending'</span><span class="p">],</span> <span class="p">[</span><span class="s1">'year'</span><span class="p">,</span> <span class="s1">'descending'</span><span class="p">]],</span> <span class="nx">result</span><span class="p">);</span> <span class="nx">complex_queries</span><span class="p">.</span><span class="nx">limit</span><span class="p">([</span><span class="mi">20</span><span class="p">,</span> <span class="mi">20</span><span class="p">],</span> <span class="nx">result</span><span class="p">);</span> <span class="nx">complex_queries</span><span class="p">.</span><span class="nx">select</span><span class="p">([</span><span class="s1">'title'</span><span class="p">,</span> <span class="s1">'year'</span><span class="p">],</span> <span class="nx">result</span><span class="p">);</span> </pre></div> </div> <div class="section" id="complex-queries-in-storage-connectors"> <h3>Complex Queries in storage connectors<a class="headerlink" href="#complex-queries-in-storage-connectors" title="Permalink to this headline">¶</a></h3> <p>The query exec method must only be used if the server is not able to pre-select documents. As mentioned before, you could use an indexStorage to maintain indices with key information on all documents in a storage. This index file will then be used to run queries, if all of the fields required in the query answer are available in the index.</p> </div> <div class="section" id="matching-properties"> <h3>Matching properties<a class="headerlink" href="#matching-properties" title="Permalink to this headline">¶</a></h3> <p>Complex Queries select items which exactly match the value given in the query. You can use wildcards (‘%’ is the default wildcard character), and you can change the wildcard character in the query options object. If you don’t want to use a wildcard, just set the wildcard character to an empty string.</p> <div class="highlight-javascript"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">query</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"query"</span><span class="o">:</span> <span class="s1">'creator:"* Doe"'</span><span class="p">,</span> <span class="s2">"wildcard_character"</span><span class="o">:</span> <span class="s2">"*"</span> <span class="p">};</span> </pre></div> </div> </div> <div class="section" id="should-default-search-types-be-defined-in-jio-or-in-user-interface-components"> <h3>Should default search types be defined in jIO or in user interface components?<a class="headerlink" href="#should-default-search-types-be-defined-in-jio-or-in-user-interface-components" title="Permalink to this headline">¶</a></h3> <p>Default search types should be defined in the application’s user interface components because criteria like filters will be changed frequently by the component (change <tt class="docutils literal"><span class="pre">limit:</span> <span class="pre">[0,</span> <span class="pre">10]</span></tt> to <tt class="docutils literal"><span class="pre">limit:</span> <span class="pre">[10,</span> <span class="pre">10]</span></tt> or <tt class="docutils literal"><span class="pre">sort_on:</span> <span class="pre">[['title',</span> <span class="pre">'ascending']]</span></tt> to <tt class="docutils literal"><span class="pre">sort_on:</span> <span class="pre">[['creator',</span> <span class="pre">'ascending']]</span></tt>) and each component must have its own default properties to keep their own behavior.</p> </div> <div class="section" id="convert-complex-queries-into-another-type"> <h3>Convert Complex Queries into another type<a class="headerlink" href="#convert-complex-queries-into-another-type" title="Permalink to this headline">¶</a></h3> <p>Example, convert Query object into a human readable string:</p> <div class="highlight-javascript"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">query</span> <span class="o">=</span> <span class="nx">complex_queries</span><span class="p">.</span><span class="nx">QueryFactory</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="s1">'year: < 2000 OR title: "*a"'</span><span class="p">),</span> <span class="nx">option</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"wildcard_character"</span><span class="o">:</span> <span class="s2">"*"</span><span class="p">,</span> <span class="s2">"limit"</span><span class="o">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">]</span> <span class="p">},</span> <span class="nx">human_read</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"<"</span><span class="o">:</span> <span class="s2">"is lower than "</span><span class="p">,</span> <span class="s2">"<="</span><span class="o">:</span> <span class="s2">"is lower or equal than "</span><span class="p">,</span> <span class="s2">">"</span><span class="o">:</span> <span class="s2">"is greater than "</span><span class="p">,</span> <span class="s2">">="</span><span class="o">:</span> <span class="s2">"is greater or equal than "</span><span class="p">,</span> <span class="s2">"="</span><span class="o">:</span> <span class="s2">"matches "</span><span class="p">,</span> <span class="s2">"!="</span><span class="o">:</span> <span class="s2">"doesn't match "</span> <span class="p">};</span> <span class="nx">query</span><span class="p">.</span><span class="nx">onParseStart</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">object</span><span class="p">,</span> <span class="nx">option</span><span class="p">)</span> <span class="p">{</span> <span class="nx">object</span><span class="p">.</span><span class="nx">start</span> <span class="o">=</span> <span class="s2">"The wildcard character is '"</span> <span class="o">+</span> <span class="p">(</span><span class="nx">option</span><span class="p">.</span><span class="nx">wildcard_character</span> <span class="o">||</span> <span class="s2">"%"</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"' and we need only the "</span> <span class="o">+</span> <span class="nx">option</span><span class="p">.</span><span class="nx">limit</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="s2">" elements from the numero "</span> <span class="o">+</span> <span class="nx">option</span><span class="p">.</span><span class="nx">limit</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="s2">". "</span><span class="p">;</span> <span class="p">};</span> <span class="nx">query</span><span class="p">.</span><span class="nx">onParseSimpleQuery</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">object</span><span class="p">,</span> <span class="nx">option</span><span class="p">)</span> <span class="p">{</span> <span class="nx">object</span><span class="p">.</span><span class="nx">parsed</span> <span class="o">=</span> <span class="nx">object</span><span class="p">.</span><span class="nx">parsed</span><span class="p">.</span><span class="nx">key</span> <span class="o">+</span> <span class="s2">" "</span> <span class="o">+</span> <span class="nx">human_read</span><span class="p">[</span><span class="nx">object</span><span class="p">.</span><span class="nx">parsed</span><span class="p">.</span><span class="nx">operator</span><span class="p">]</span> <span class="o">+</span> <span class="nx">object</span><span class="p">.</span><span class="nx">parsed</span><span class="p">.</span><span class="nx">value</span><span class="p">;</span> <span class="p">};</span> <span class="nx">query</span><span class="p">.</span><span class="nx">onParseComplexQuery</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">object</span><span class="p">,</span> <span class="nx">option</span><span class="p">)</span> <span class="p">{</span> <span class="nx">object</span><span class="p">.</span><span class="nx">parsed</span> <span class="o">=</span> <span class="s2">"I want all document where "</span> <span class="o">+</span> <span class="nx">object</span><span class="p">.</span><span class="nx">parsed</span><span class="p">.</span><span class="nx">query_list</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s2">" "</span> <span class="o">+</span> <span class="nx">object</span><span class="p">.</span><span class="nx">parsed</span><span class="p">.</span><span class="nx">operator</span><span class="p">.</span><span class="nx">toLowerCase</span><span class="p">()</span> <span class="o">+</span> <span class="s2">" "</span><span class="p">)</span> <span class="o">+</span> <span class="s2">". "</span><span class="p">;</span> <span class="p">};</span> <span class="nx">query</span><span class="p">.</span><span class="nx">onParseEnd</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">object</span><span class="p">,</span> <span class="nx">option</span><span class="p">)</span> <span class="p">{</span> <span class="nx">object</span><span class="p">.</span><span class="nx">parsed</span> <span class="o">=</span> <span class="nx">object</span><span class="p">.</span><span class="nx">start</span> <span class="o">+</span> <span class="nx">object</span><span class="p">.</span><span class="nx">parsed</span> <span class="o">+</span> <span class="s2">"Thank you!"</span><span class="p">;</span> <span class="p">};</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">query</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">option</span><span class="p">));</span> <span class="c1">// logged: "The wildcard character is '*' and we need only the 10 elements</span> <span class="c1">// from the numero 0. I want all document where year is lower than 2000 or title</span> <span class="c1">// matches *a. Thank you!"</span> </pre></div> </div> </div> </div> <div class="section" id="json-schemas-and-grammar"> <h2>JSON Schemas and Grammar<a class="headerlink" href="#json-schemas-and-grammar" title="Permalink to this headline">¶</a></h2> <p>Below you can find schemas for constructing queries.</p> <ul> <li><p class="first">Complex Queries JSON Schema:</p> <div class="highlight-javascript"><div class="highlight"><pre><span class="p">{</span> <span class="s2">"id"</span><span class="o">:</span> <span class="s2">"ComplexQuery"</span><span class="p">,</span> <span class="s2">"properties"</span><span class="o">:</span> <span class="p">{</span> <span class="s2">"type"</span><span class="o">:</span> <span class="p">{</span> <span class="s2">"type"</span><span class="o">:</span> <span class="s2">"string"</span><span class="p">,</span> <span class="s2">"format"</span><span class="o">:</span> <span class="s2">"complex"</span><span class="p">,</span> <span class="s2">"default"</span><span class="o">:</span> <span class="s2">"complex"</span><span class="p">,</span> <span class="s2">"description"</span><span class="o">:</span> <span class="s2">"The type is used to recognize the query type."</span> <span class="p">},</span> <span class="s2">"operator"</span><span class="o">:</span> <span class="p">{</span> <span class="s2">"type"</span><span class="o">:</span> <span class="s2">"string"</span><span class="p">,</span> <span class="s2">"format"</span><span class="o">:</span> <span class="s2">"(AND|OR|NOT)"</span><span class="p">,</span> <span class="s2">"required"</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="s2">"description"</span><span class="o">:</span> <span class="s2">"Can be 'AND', 'OR' or 'NOT'."</span> <span class="p">},</span> <span class="s2">"query_list"</span><span class="o">:</span> <span class="p">{</span> <span class="s2">"type"</span><span class="o">:</span> <span class="s2">"array"</span><span class="p">,</span> <span class="s2">"items"</span><span class="o">:</span> <span class="p">{</span> <span class="s2">"type"</span><span class="o">:</span> <span class="s2">"object"</span> <span class="p">},</span> <span class="s2">"required"</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="s2">"default"</span><span class="o">:</span> <span class="p">[],</span> <span class="s2">"description"</span><span class="o">:</span> <span class="s2">"query_list is a list of queries which can be in serialized format of in object format."</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> </pre></div> </div> </li> <li><p class="first">Simple Queries JSON Schema:</p> <div class="highlight-javascript"><div class="highlight"><pre><span class="p">{</span> <span class="s2">"id"</span><span class="o">:</span> <span class="s2">"SimpleQuery"</span><span class="p">,</span> <span class="s2">"properties"</span><span class="o">:</span> <span class="p">{</span> <span class="s2">"type"</span><span class="o">:</span> <span class="p">{</span> <span class="s2">"type"</span><span class="o">:</span> <span class="s2">"string"</span><span class="p">,</span> <span class="s2">"format"</span><span class="o">:</span> <span class="s2">"simple"</span><span class="p">,</span> <span class="s2">"default"</span><span class="o">:</span> <span class="s2">"simple"</span><span class="p">,</span> <span class="s2">"description"</span><span class="o">:</span> <span class="s2">"The type is used to recognize the query type."</span> <span class="p">},</span> <span class="s2">"operator"</span><span class="o">:</span> <span class="p">{</span> <span class="s2">"type"</span><span class="o">:</span> <span class="s2">"string"</span><span class="p">,</span> <span class="s2">"default"</span><span class="o">:</span> <span class="s2">"="</span><span class="p">,</span> <span class="s2">"format"</span><span class="o">:</span> <span class="s2">"(>=?|<=?|!?=)"</span><span class="p">,</span> <span class="s2">"description"</span><span class="o">:</span> <span class="s2">"The operator used to compare."</span> <span class="p">},</span> <span class="s2">"id"</span><span class="o">:</span> <span class="p">{</span> <span class="s2">"type"</span><span class="o">:</span> <span class="s2">"string"</span><span class="p">,</span> <span class="s2">"default"</span><span class="o">:</span> <span class="s2">""</span><span class="p">,</span> <span class="s2">"description"</span><span class="o">:</span> <span class="s2">"The column id."</span> <span class="p">},</span> <span class="s2">"value"</span><span class="o">:</span> <span class="p">{</span> <span class="s2">"type"</span><span class="o">:</span> <span class="s2">"string"</span><span class="p">,</span> <span class="s2">"default"</span><span class="o">:</span> <span class="s2">""</span><span class="p">,</span> <span class="s2">"description"</span><span class="o">:</span> <span class="s2">"The value we want to search."</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> </pre></div> </div> </li> <li><p class="first">Complex Queries Grammar:</p> <div class="highlight-python"><pre>search_text : and_expression | and_expression search_text | and_expression OR search_text and_expression : boolean_expression | boolean_expression AND and_expression boolean_expression : NOT expression | expression expression : ( search_text ) | COLUMN expression | value value : OPERATOR string | string string : WORD | STRING terminal: OR -> /OR[ ]/ AND -> /AND[ ]/ NOT -> /NOT[ ]/ COLUMN -> /[^><= :\(\)"][^ :\(\)"]*:/ STRING -> /"(\\.|[^\\"])*"/ WORD -> /[^><= :\(\)"][^ :\(\)"]*/ OPERATOR -> /(>=?|<=?|!?=)/ LEFT_PARENTHESE -> /\(/ RIGHT_PARENTHESE -> /\)/ ignore: " "</pre> </div> </li> </ul> </div> </div> </div> </div> </div> <div class="sphinxsidebar"> <div class="sphinxsidebarwrapper"> <p class="logo"><a href="index.html"> <img class="logo" src="_static/jio-logo.png" alt="Logo"/> </a></p> <h3><a href="index.html">Table Of Contents</a></h3> <ul> <li><a class="reference internal" href="#">jIO Complex Queries</a><ul> <li><a class="reference internal" href="#what-are-complex-queries">What are Complex Queries?</a></li> <li><a class="reference internal" href="#why-use-complex-queries">Why use Complex Queries?</a></li> <li><a class="reference internal" href="#how-to-use-complex-queries-with-jio">How to use Complex Queries with jIO?</a></li> <li><a class="reference internal" href="#how-to-use-complex-queries-outside-jio">How to use Complex Queries outside jIO?</a><ul> <li><a class="reference internal" href="#complex-queries-in-storage-connectors">Complex Queries in storage connectors</a></li> <li><a class="reference internal" href="#matching-properties">Matching properties</a></li> <li><a class="reference internal" href="#should-default-search-types-be-defined-in-jio-or-in-user-interface-components">Should default search types be defined in jIO or in user interface components?</a></li> <li><a class="reference internal" href="#convert-complex-queries-into-another-type">Convert Complex Queries into another type</a></li> </ul> </li> <li><a class="reference internal" href="#json-schemas-and-grammar">JSON Schemas and Grammar</a></li> </ul> </li> </ul> <h4>Previous topic</h4> <p class="topless"><a href="gid_storage.html" title="previous chapter">jIO GIDStorage</a></p> <h4>Next topic</h4> <p class="topless"><a href="metadata.html" title="next chapter">Metadata</a></p> <h3>This Page</h3> <ul class="this-page-menu"> <li><a href="_sources/complex_queries.txt" rel="nofollow">Show Source</a></li> </ul> <div id="searchbox" style="display: none"> <h3>Quick search</h3> <form class="search" action="search.html" method="get"> <input type="text" name="q" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> Enter search terms or a module, class or function name. </p> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="clearer"></div> </div> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="genindex.html" title="General Index" >index</a></li> <li class="right" > <a href="metadata.html" title="Metadata" >next</a> |</li> <li class="right" > <a href="gid_storage.html" title="jIO GIDStorage" >previous</a> |</li> <li><a href="index.html">jIO 2.0.0 documentation</a> »</li> </ul> </div> <div class="footer"> © Copyright 2013, Nexedi. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. </div> </body> </html>