3734 lines
107 KiB
HTML
3734 lines
107 KiB
HTML
<!DOCTYPE html>
|
|
<html xmlns='http://www.w3.org/1999/xhtml'>
|
|
<head>
|
|
<title>Code coverage for Pg searchable</title>
|
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
|
<script src='./assets/0.10.2/application.js' type='text/javascript'></script>
|
|
<link href='./assets/0.10.2/application.css' media='screen, projection, print' rel='stylesheet' type='text/css'>
|
|
<link rel="shortcut icon" type="image/png" href="./assets/0.10.2/favicon_red.png" />
|
|
<link rel="icon" type="image/png" href="./assets/0.10.2/favicon.png" />
|
|
</head>
|
|
|
|
<body>
|
|
<div id="loading">
|
|
<img src="./assets/0.10.2/loading.gif" alt="loading"/>
|
|
</div>
|
|
<div id="wrapper" style="display:none;">
|
|
<div class="timestamp">Generated <abbr class="timeago" title="2020-03-11T13:02:19+01:00">2020-03-11T13:02:19+01:00</abbr></div>
|
|
<ul class="group_tabs"></ul>
|
|
|
|
<div id="content">
|
|
<div class="file_list_container" id="AllFiles">
|
|
<h2>
|
|
<span class="group_name">All Files</span>
|
|
(<span class="covered_percent"><span class="red">78.1%</span></span>
|
|
covered at
|
|
<span class="covered_strength">
|
|
<span class="green">
|
|
69.62
|
|
</span>
|
|
</span> hits/line)
|
|
</h2>
|
|
<a name="AllFiles"></a>
|
|
<div>
|
|
<b>5</b> files in total.
|
|
<b>242</b> relevant lines.
|
|
<span class="green"><b>189</b> lines covered</span> and
|
|
<span class="red"><b>53</b> lines missed </span>
|
|
</div>
|
|
<table class="file_list">
|
|
<thead>
|
|
<tr>
|
|
<th>File</th>
|
|
<th>% covered</th>
|
|
<th>Lines</th>
|
|
<th>Relevant Lines</th>
|
|
<th>Lines covered</th>
|
|
<th>Lines missed</th>
|
|
<th>Avg. Hits / Line</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
|
|
<tr>
|
|
<td class="strong"><a href="#a29538796e1cb41001a28dcef0fd438a7ef047d5" class="src_link" title="lib/lexer.rb">lib/lexer.rb</a></td>
|
|
<td class="yellow strong">86.67 %</td>
|
|
<td>107</td>
|
|
<td>60</td>
|
|
<td>52</td>
|
|
<td>8</td>
|
|
<td>237.5</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="strong"><a href="#0e10d086d9e94647296f9b86811e08309003f41c" class="src_link" title="lib/parser.rb">lib/parser.rb</a></td>
|
|
<td class="green strong">96.97 %</td>
|
|
<td>207</td>
|
|
<td>33</td>
|
|
<td>32</td>
|
|
<td>1</td>
|
|
<td>1.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="strong"><a href="#753228502df7d7eba3c0631f5c2586671ab90064" class="src_link" title="lib/pg_searchable_regex.rb">lib/pg_searchable_regex.rb</a></td>
|
|
<td class="yellow strong">87.5 %</td>
|
|
<td>80</td>
|
|
<td>40</td>
|
|
<td>35</td>
|
|
<td>5</td>
|
|
<td>7.7</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="strong"><a href="#ce19b53ff8fa35fd6a57aa6b7ede25d3648dd01c" class="src_link" title="lib/text_to_sql_query.rb">lib/text_to_sql_query.rb</a></td>
|
|
<td class="green strong">92.86 %</td>
|
|
<td>93</td>
|
|
<td>56</td>
|
|
<td>52</td>
|
|
<td>4</td>
|
|
<td>40.0</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="strong"><a href="#1f620dc5aa56fc59374eab391bb6c70e9b12c49b" class="src_link" title="lib/text_to_tsquery.rb">lib/text_to_tsquery.rb</a></td>
|
|
<td class="red strong">33.96 %</td>
|
|
<td>99</td>
|
|
<td>53</td>
|
|
<td>18</td>
|
|
<td>35</td>
|
|
<td>0.3</td>
|
|
</tr>
|
|
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
<div id="footer">
|
|
Generated by <a href="http://github.com/colszowka/simplecov">simplecov</a> v0.16.1
|
|
and simplecov-html v0.10.2<br/>
|
|
using RSpec
|
|
</div>
|
|
|
|
<div class="source_files">
|
|
|
|
<div class="source_table" id="a29538796e1cb41001a28dcef0fd438a7ef047d5">
|
|
<div class="header">
|
|
<h3>lib/lexer.rb</h3>
|
|
<h4><span class="yellow">86.67 %</span> covered</h4>
|
|
<div>
|
|
<b>60</b> relevant lines.
|
|
<span class="green"><b>52</b> lines covered</span> and
|
|
<span class="red"><b>8</b> lines missed.</span>
|
|
</div>
|
|
</div>
|
|
|
|
<pre>
|
|
<ol>
|
|
|
|
<li class="never" data-hits="" data-linenumber="1">
|
|
|
|
|
|
<code class="ruby">#--</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="2">
|
|
|
|
|
|
<code class="ruby"># DO NOT MODIFY!!!!</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="3">
|
|
|
|
|
|
<code class="ruby"># This file is automatically generated by rex 1.0.7</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="4">
|
|
|
|
|
|
<code class="ruby"># from lexical definition file "./lib/specification.rex".</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="5">
|
|
|
|
|
|
<code class="ruby">#++</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="6">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="7">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">require 'racc/parser'</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="8">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">class Query < Racc::Parser</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="9">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> require 'strscan'</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="10">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="11">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> class ScanError < StandardError ; end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="12">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="13">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> attr_reader :lineno</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="14">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> attr_reader :filename</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="15">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> attr_accessor :state</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="16">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="17">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def scan_setup(str)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="132" data-linenumber="18">
|
|
<span class="hits">132</span>
|
|
|
|
<code class="ruby"> @ss = StringScanner.new(str)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="132" data-linenumber="19">
|
|
<span class="hits">132</span>
|
|
|
|
<code class="ruby"> @lineno = 1</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="132" data-linenumber="20">
|
|
<span class="hits">132</span>
|
|
|
|
<code class="ruby"> @state = nil</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="21">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="22">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="23">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def action</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="702" data-linenumber="24">
|
|
<span class="hits">702</span>
|
|
|
|
<code class="ruby"> yield</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="25">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="26">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="27">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def scan_str(str)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="94" data-linenumber="28">
|
|
<span class="hits">94</span>
|
|
|
|
<code class="ruby"> scan_setup(str)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="94" data-linenumber="29">
|
|
<span class="hits">94</span>
|
|
|
|
<code class="ruby"> do_parse</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="30">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="31">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> alias :scan :scan_str</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="32">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="33">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def load_file( filename )</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="34">
|
|
|
|
|
|
<code class="ruby"> @filename = filename</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="35">
|
|
|
|
|
|
<code class="ruby"> File.open(filename, "r") do |f|</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="36">
|
|
|
|
|
|
<code class="ruby"> scan_setup(f.read)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="37">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="38">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="39">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="40">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def scan_file( filename )</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="41">
|
|
|
|
|
|
<code class="ruby"> load_file(filename)</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="42">
|
|
|
|
|
|
<code class="ruby"> do_parse</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="43">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="44">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="45">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="46">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def next_token</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="834" data-linenumber="47">
|
|
<span class="hits">834</span>
|
|
|
|
<code class="ruby"> return if @ss.eos?</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="48">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="49">
|
|
|
|
|
|
<code class="ruby"> # skips empty actions</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="703" data-linenumber="50">
|
|
<span class="hits">703</span>
|
|
|
|
<code class="ruby"> until token = _next_token or @ss.eos?; end</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="703" data-linenumber="51">
|
|
<span class="hits">703</span>
|
|
|
|
<code class="ruby"> token</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="52">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="53">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="54">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def _next_token</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="939" data-linenumber="55">
|
|
<span class="hits">939</span>
|
|
|
|
<code class="ruby"> text = @ss.peek(1)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="939" data-linenumber="56">
|
|
<span class="hits">939</span>
|
|
|
|
<code class="ruby"> @lineno += 1 if text == "\n"</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="939" data-linenumber="57">
|
|
<span class="hits">939</span>
|
|
|
|
<code class="ruby"> token = case @state</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="58">
|
|
|
|
|
|
<code class="ruby"> when nil</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="59">
|
|
|
|
|
|
<code class="ruby"> case</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="939" data-linenumber="60">
|
|
<span class="hits">939</span>
|
|
|
|
<code class="ruby"> when (text = @ss.scan(/ +/))</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="61">
|
|
|
|
|
|
<code class="ruby"> ;</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="62">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="702" data-linenumber="63">
|
|
<span class="hits">702</span>
|
|
|
|
<code class="ruby"> when (text = @ss.scan(/\(/))</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="106" data-linenumber="64">
|
|
<span class="hits">106</span>
|
|
|
|
<code class="ruby"> action { return [:L_BRACKET, text] }</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="65">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="649" data-linenumber="66">
|
|
<span class="hits">649</span>
|
|
|
|
<code class="ruby"> when (text = @ss.scan(/\)/))</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="106" data-linenumber="67">
|
|
<span class="hits">106</span>
|
|
|
|
<code class="ruby"> action { return [:R_BRACKET, text] }</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="68">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="596" data-linenumber="69">
|
|
<span class="hits">596</span>
|
|
|
|
<code class="ruby"> when (text = @ss.scan(/(?i)\bor\b/))</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="84" data-linenumber="70">
|
|
<span class="hits">84</span>
|
|
|
|
<code class="ruby"> action { return [:OPERATOR_OR, text] }</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="71">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="554" data-linenumber="72">
|
|
<span class="hits">554</span>
|
|
|
|
<code class="ruby"> when (text = @ss.scan(/(?i)\band\b/))</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="84" data-linenumber="73">
|
|
<span class="hits">84</span>
|
|
|
|
<code class="ruby"> action { return [:OPERATOR_AND, text] }</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="74">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="512" data-linenumber="75">
|
|
<span class="hits">512</span>
|
|
|
|
<code class="ruby"> when (text = @ss.scan(/(?i)\bnot\b/))</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="46" data-linenumber="76">
|
|
<span class="hits">46</span>
|
|
|
|
<code class="ruby"> action { return [:OPERATOR_NOT, text] }</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="77">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="489" data-linenumber="78">
|
|
<span class="hits">489</span>
|
|
|
|
<code class="ruby"> when (text = @ss.scan(/"([^"]*)"/))</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="132" data-linenumber="79">
|
|
<span class="hits">132</span>
|
|
|
|
<code class="ruby"> action { return [:TERM_WITH_QUOTES, text] }</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="80">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="423" data-linenumber="81">
|
|
<span class="hits">423</span>
|
|
|
|
<code class="ruby"> when (text = @ss.scan(/[a-zA-Z0-9\-_]+/))</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="610" data-linenumber="82">
|
|
<span class="hits">610</span>
|
|
|
|
<code class="ruby"> action { return [:TERM_WITHOUT_QUOTES, text] }</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="83">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="118" data-linenumber="84">
|
|
<span class="hits">118</span>
|
|
|
|
<code class="ruby"> when (text = @ss.scan(/\:/))</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="236" data-linenumber="85">
|
|
<span class="hits">236</span>
|
|
|
|
<code class="ruby"> action { return [:COLON, text] }</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="86">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="87">
|
|
|
|
|
|
<code class="ruby"> </code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="88">
|
|
|
|
|
|
<code class="ruby"> else</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="89">
|
|
|
|
|
|
<code class="ruby"> text = @ss.string[@ss.pos .. -1]</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="90">
|
|
|
|
|
|
<code class="ruby"> raise ScanError, "can not match: '" + text + "'"</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="939" data-linenumber="91">
|
|
<span class="hits">939</span>
|
|
|
|
<code class="ruby"> end # if</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="92">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="93">
|
|
|
|
|
|
<code class="ruby"> else</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="94">
|
|
|
|
|
|
<code class="ruby"> raise ScanError, "undefined state: '" + state.to_s + "'"</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="95">
|
|
|
|
|
|
<code class="ruby"> end # case state</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="237" data-linenumber="96">
|
|
<span class="hits">237</span>
|
|
|
|
<code class="ruby"> token</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="97">
|
|
|
|
|
|
<code class="ruby"> end # def _next_token</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="98">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="99">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def tokenize(code)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="38" data-linenumber="100">
|
|
<span class="hits">38</span>
|
|
|
|
<code class="ruby"> scan_setup(code)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="38" data-linenumber="101">
|
|
<span class="hits">38</span>
|
|
|
|
<code class="ruby"> tokens = []</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="38" data-linenumber="102">
|
|
<span class="hits">38</span>
|
|
|
|
<code class="ruby"> while token = next_token</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="174" data-linenumber="103">
|
|
<span class="hits">174</span>
|
|
|
|
<code class="ruby"> tokens << token</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="104">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="38" data-linenumber="105">
|
|
<span class="hits">38</span>
|
|
|
|
<code class="ruby"> tokens</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="106">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="107">
|
|
|
|
|
|
<code class="ruby">end # class</code>
|
|
</li>
|
|
|
|
</ol>
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div class="source_table" id="0e10d086d9e94647296f9b86811e08309003f41c">
|
|
<div class="header">
|
|
<h3>lib/parser.rb</h3>
|
|
<h4><span class="green">96.97 %</span> covered</h4>
|
|
<div>
|
|
<b>33</b> relevant lines.
|
|
<span class="green"><b>32</b> lines covered</span> and
|
|
<span class="red"><b>1</b> lines missed.</span>
|
|
</div>
|
|
</div>
|
|
|
|
<pre>
|
|
<ol>
|
|
|
|
<li class="never" data-hits="" data-linenumber="1">
|
|
|
|
|
|
<code class="ruby">#</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="2">
|
|
|
|
|
|
<code class="ruby"># DO NOT MODIFY!!!!</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="3">
|
|
|
|
|
|
<code class="ruby"># This file is automatically generated by Racc 1.4.16</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="4">
|
|
|
|
|
|
<code class="ruby"># from Racc grammar file "".</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="5">
|
|
|
|
|
|
<code class="ruby">#</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="6">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="7">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">require 'racc/parser.rb'</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="8">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="9">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> require_relative 'lexer'</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="10">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="11">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">class Query < Racc::Parser</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="12">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="13">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">module_eval(<<'...end grammar.y/module_eval...', 'grammar.y', 26)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="14">
|
|
|
|
|
|
<code class="ruby"> def parse(input)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="15">
|
|
|
|
|
|
<code class="ruby"> scan_str(input)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="16">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="17">
|
|
|
|
|
|
<code class="ruby">...end grammar.y/module_eval...</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="18">
|
|
|
|
|
|
<code class="ruby">##### State transition tables begin ###</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="19">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="20">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">racc_action_table = [</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="21">
|
|
|
|
|
|
<code class="ruby"> 5, 10, 9, 3, 4, 5, 6, 19, 3, 4,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="22">
|
|
|
|
|
|
<code class="ruby"> 7, 6, 5, 10, 9, 3, 4, 5, 6, 11,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="23">
|
|
|
|
|
|
<code class="ruby"> 3, 4, 5, 6, 14, 3, 4, nil, 6, 5,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="24">
|
|
|
|
|
|
<code class="ruby"> 10, 9, 3, 4, 5, 6, nil, 3, 4, 5,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="25">
|
|
|
|
|
|
<code class="ruby"> 6, nil, 3, 4, nil, 6, 5, 10, nil, 3,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="26">
|
|
|
|
|
|
<code class="ruby"> 4, 5, 6, nil, 3, 4, nil, 6, 3, 4,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="27">
|
|
|
|
|
|
<code class="ruby"> nil, 6, 17, 18 ]</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="28">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="29">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">racc_action_check = [</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="30">
|
|
|
|
|
|
<code class="ruby"> 13, 13, 13, 13, 13, 0, 13, 13, 0, 0,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="31">
|
|
|
|
|
|
<code class="ruby"> 1, 0, 2, 2, 2, 2, 2, 5, 2, 3,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="32">
|
|
|
|
|
|
<code class="ruby"> 5, 5, 6, 5, 7, 6, 6, nil, 6, 8,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="33">
|
|
|
|
|
|
<code class="ruby"> 8, 8, 8, 8, 9, 8, nil, 9, 9, 10,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="34">
|
|
|
|
|
|
<code class="ruby"> 9, nil, 10, 10, nil, 10, 15, 15, nil, 15,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="35">
|
|
|
|
|
|
<code class="ruby"> 15, 16, 15, nil, 16, 16, nil, 16, 12, 12,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="36">
|
|
|
|
|
|
<code class="ruby"> nil, 12, 11, 11 ]</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="37">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="38">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">racc_action_pointer = [</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="39">
|
|
|
|
|
|
<code class="ruby"> 3, 10, 10, 12, nil, 15, 20, 24, 27, 32,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="40">
|
|
|
|
|
|
<code class="ruby"> 37, 57, 53, -2, nil, 44, 49, nil, nil, nil ]</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="41">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="42">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">racc_action_default = [</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="43">
|
|
|
|
|
|
<code class="ruby"> -2, -12, -1, -3, -4, -12, -12, -12, -11, -12,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="44">
|
|
|
|
|
|
<code class="ruby"> -12, -12, -9, -12, 20, -7, -8, -5, -6, -10 ]</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="45">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="46">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">racc_goto_table = [</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="47">
|
|
|
|
|
|
<code class="ruby"> 2, 1, nil, nil, nil, 12, 13, nil, nil, 15,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="48">
|
|
|
|
|
|
<code class="ruby"> 16 ]</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="49">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="50">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">racc_goto_check = [</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="51">
|
|
|
|
|
|
<code class="ruby"> 2, 1, nil, nil, nil, 2, 2, nil, nil, 2,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="52">
|
|
|
|
|
|
<code class="ruby"> 2 ]</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="53">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="54">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">racc_goto_pointer = [</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="55">
|
|
|
|
|
|
<code class="ruby"> nil, 1, 0 ]</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="56">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="57">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">racc_goto_default = [</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="58">
|
|
|
|
|
|
<code class="ruby"> nil, nil, 8 ]</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="59">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="60">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">racc_reduce_table = [</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="61">
|
|
|
|
|
|
<code class="ruby"> 0, 0, :racc_error,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="62">
|
|
|
|
|
|
<code class="ruby"> 1, 11, :_reduce_none,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="63">
|
|
|
|
|
|
<code class="ruby"> 0, 11, :_reduce_2,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="64">
|
|
|
|
|
|
<code class="ruby"> 1, 12, :_reduce_3,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="65">
|
|
|
|
|
|
<code class="ruby"> 1, 12, :_reduce_4,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="66">
|
|
|
|
|
|
<code class="ruby"> 3, 12, :_reduce_5,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="67">
|
|
|
|
|
|
<code class="ruby"> 3, 12, :_reduce_6,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="68">
|
|
|
|
|
|
<code class="ruby"> 3, 12, :_reduce_7,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="69">
|
|
|
|
|
|
<code class="ruby"> 3, 12, :_reduce_8,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="70">
|
|
|
|
|
|
<code class="ruby"> 2, 12, :_reduce_9,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="71">
|
|
|
|
|
|
<code class="ruby"> 3, 12, :_reduce_10,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="72">
|
|
|
|
|
|
<code class="ruby"> 2, 12, :_reduce_11 ]</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="73">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="74">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">racc_reduce_n = 12</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="75">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="76">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">racc_shift_n = 20</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="77">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="78">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">racc_token_table = {</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="79">
|
|
|
|
|
|
<code class="ruby"> false => 0,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="80">
|
|
|
|
|
|
<code class="ruby"> :error => 1,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="81">
|
|
|
|
|
|
<code class="ruby"> :OPERATOR_NOT => 2,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="82">
|
|
|
|
|
|
<code class="ruby"> :OPERATOR_AND => 3,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="83">
|
|
|
|
|
|
<code class="ruby"> :OPERATOR_OR => 4,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="84">
|
|
|
|
|
|
<code class="ruby"> :TERM_WITHOUT_QUOTES => 5,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="85">
|
|
|
|
|
|
<code class="ruby"> :TERM_WITH_QUOTES => 6,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="86">
|
|
|
|
|
|
<code class="ruby"> :COLON => 7,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="87">
|
|
|
|
|
|
<code class="ruby"> :L_BRACKET => 8,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="88">
|
|
|
|
|
|
<code class="ruby"> :R_BRACKET => 9 }</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="89">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="90">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">racc_nt_base = 10</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="91">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="92">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">racc_use_result_var = true</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="93">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="94">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">Racc_arg = [</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="95">
|
|
|
|
|
|
<code class="ruby"> racc_action_table,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="96">
|
|
|
|
|
|
<code class="ruby"> racc_action_check,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="97">
|
|
|
|
|
|
<code class="ruby"> racc_action_default,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="98">
|
|
|
|
|
|
<code class="ruby"> racc_action_pointer,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="99">
|
|
|
|
|
|
<code class="ruby"> racc_goto_table,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="100">
|
|
|
|
|
|
<code class="ruby"> racc_goto_check,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="101">
|
|
|
|
|
|
<code class="ruby"> racc_goto_default,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="102">
|
|
|
|
|
|
<code class="ruby"> racc_goto_pointer,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="103">
|
|
|
|
|
|
<code class="ruby"> racc_nt_base,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="104">
|
|
|
|
|
|
<code class="ruby"> racc_reduce_table,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="105">
|
|
|
|
|
|
<code class="ruby"> racc_token_table,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="106">
|
|
|
|
|
|
<code class="ruby"> racc_shift_n,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="107">
|
|
|
|
|
|
<code class="ruby"> racc_reduce_n,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="108">
|
|
|
|
|
|
<code class="ruby"> racc_use_result_var ]</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="109">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="110">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">Racc_token_to_s_table = [</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="111">
|
|
|
|
|
|
<code class="ruby"> "$end",</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="112">
|
|
|
|
|
|
<code class="ruby"> "error",</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="113">
|
|
|
|
|
|
<code class="ruby"> "OPERATOR_NOT",</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="114">
|
|
|
|
|
|
<code class="ruby"> "OPERATOR_AND",</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="115">
|
|
|
|
|
|
<code class="ruby"> "OPERATOR_OR",</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="116">
|
|
|
|
|
|
<code class="ruby"> "TERM_WITHOUT_QUOTES",</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="117">
|
|
|
|
|
|
<code class="ruby"> "TERM_WITH_QUOTES",</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="118">
|
|
|
|
|
|
<code class="ruby"> "COLON",</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="119">
|
|
|
|
|
|
<code class="ruby"> "L_BRACKET",</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="120">
|
|
|
|
|
|
<code class="ruby"> "R_BRACKET",</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="121">
|
|
|
|
|
|
<code class="ruby"> "$start",</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="122">
|
|
|
|
|
|
<code class="ruby"> "target",</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="123">
|
|
|
|
|
|
<code class="ruby"> "expression" ]</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="124">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="125">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">Racc_debug_parser = false</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="126">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="127">
|
|
|
|
|
|
<code class="ruby">##### State transition tables end #####</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="128">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="129">
|
|
|
|
|
|
<code class="ruby"># reduce 0 omitted</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="130">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="131">
|
|
|
|
|
|
<code class="ruby"># reduce 1 omitted</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="132">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="133">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">module_eval(<<'.,.,', 'grammar.y', 8)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="134">
|
|
|
|
|
|
<code class="ruby"> def _reduce_2(val, _values, result)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="135">
|
|
|
|
|
|
<code class="ruby"> result = 0</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="136">
|
|
|
|
|
|
<code class="ruby"> result</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="137">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="138">
|
|
|
|
|
|
<code class="ruby">.,.,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="139">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="140">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">module_eval(<<'.,.,', 'grammar.y', 10)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="141">
|
|
|
|
|
|
<code class="ruby"> def _reduce_3(val, _values, result)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="142">
|
|
|
|
|
|
<code class="ruby"> result = {:DEFAULT_COLUMN => val[0]}</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="143">
|
|
|
|
|
|
<code class="ruby"> result</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="144">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="145">
|
|
|
|
|
|
<code class="ruby">.,.,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="146">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="147">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">module_eval(<<'.,.,', 'grammar.y', 11)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="148">
|
|
|
|
|
|
<code class="ruby"> def _reduce_4(val, _values, result)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="149">
|
|
|
|
|
|
<code class="ruby"> result = {:DEFAULT_COLUMN => val[0]}</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="150">
|
|
|
|
|
|
<code class="ruby"> result</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="151">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="152">
|
|
|
|
|
|
<code class="ruby">.,.,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="153">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="154">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">module_eval(<<'.,.,', 'grammar.y', 12)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="155">
|
|
|
|
|
|
<code class="ruby"> def _reduce_5(val, _values, result)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="156">
|
|
|
|
|
|
<code class="ruby"> result = {val[0] => val[2]}</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="157">
|
|
|
|
|
|
<code class="ruby"> result</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="158">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="159">
|
|
|
|
|
|
<code class="ruby">.,.,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="160">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="161">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">module_eval(<<'.,.,', 'grammar.y', 13)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="162">
|
|
|
|
|
|
<code class="ruby"> def _reduce_6(val, _values, result)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="163">
|
|
|
|
|
|
<code class="ruby"> result = {val[0] => val[2]}</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="164">
|
|
|
|
|
|
<code class="ruby"> result</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="165">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="166">
|
|
|
|
|
|
<code class="ruby">.,.,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="167">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="168">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">module_eval(<<'.,.,', 'grammar.y', 14)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="169">
|
|
|
|
|
|
<code class="ruby"> def _reduce_7(val, _values, result)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="170">
|
|
|
|
|
|
<code class="ruby"> result = {:OPERATOR_OR => [val[0], val[2]]}</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="171">
|
|
|
|
|
|
<code class="ruby"> result</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="172">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="173">
|
|
|
|
|
|
<code class="ruby">.,.,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="174">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="175">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">module_eval(<<'.,.,', 'grammar.y', 15)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="176">
|
|
|
|
|
|
<code class="ruby"> def _reduce_8(val, _values, result)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="177">
|
|
|
|
|
|
<code class="ruby"> result = {:OPERATOR_AND => [val[0], val[2]]}</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="178">
|
|
|
|
|
|
<code class="ruby"> result</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="179">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="180">
|
|
|
|
|
|
<code class="ruby">.,.,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="181">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="182">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">module_eval(<<'.,.,', 'grammar.y', 16)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="183">
|
|
|
|
|
|
<code class="ruby"> def _reduce_9(val, _values, result)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="184">
|
|
|
|
|
|
<code class="ruby"> result = {:OPERATOR_NOT => val[1]}</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="185">
|
|
|
|
|
|
<code class="ruby"> result</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="186">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="187">
|
|
|
|
|
|
<code class="ruby">.,.,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="188">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="189">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">module_eval(<<'.,.,', 'grammar.y', 17)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="190">
|
|
|
|
|
|
<code class="ruby"> def _reduce_10(val, _values, result)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="191">
|
|
|
|
|
|
<code class="ruby"> result = val[1]</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="192">
|
|
|
|
|
|
<code class="ruby"> result</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="193">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="194">
|
|
|
|
|
|
<code class="ruby">.,.,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="195">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="196">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">module_eval(<<'.,.,', 'grammar.y', 18)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="197">
|
|
|
|
|
|
<code class="ruby"> def _reduce_11(val, _values, result)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="198">
|
|
|
|
|
|
<code class="ruby"> result = {:OPERATOR_OR => [val[0], val[1]]}</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="199">
|
|
|
|
|
|
<code class="ruby"> result</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="200">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="201">
|
|
|
|
|
|
<code class="ruby">.,.,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="202">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="203">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">def _reduce_none(val, _values, result)</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="204">
|
|
|
|
|
|
<code class="ruby"> val[0]</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="205">
|
|
|
|
|
|
<code class="ruby">end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="206">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="207">
|
|
|
|
|
|
<code class="ruby">end # class Query</code>
|
|
</li>
|
|
|
|
</ol>
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div class="source_table" id="753228502df7d7eba3c0631f5c2586671ab90064">
|
|
<div class="header">
|
|
<h3>lib/pg_searchable_regex.rb</h3>
|
|
<h4><span class="yellow">87.5 %</span> covered</h4>
|
|
<div>
|
|
<b>40</b> relevant lines.
|
|
<span class="green"><b>35</b> lines covered</span> and
|
|
<span class="red"><b>5</b> lines missed.</span>
|
|
</div>
|
|
</div>
|
|
|
|
<pre>
|
|
<ol>
|
|
|
|
<li class="never" data-hits="" data-linenumber="1">
|
|
|
|
|
|
<code class="ruby"># frozen_string_literal: true</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="2">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="3">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">require 'active_support'</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="4">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">require 'squeel'</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="5">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">require_relative './text_to_tsquery'</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="6">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">require_relative './text_to_sql_query'</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="7">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="8">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">module PgSearchable</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="9">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> extend ActiveSupport::Concern</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="10">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="11">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> included do</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="12">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> def update_pg_search_cache</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="13">
|
|
|
|
|
|
<code class="ruby"> # kept just for compatibility with pg_searchable </code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="14">
|
|
|
|
|
|
<code class="ruby"> # noop in this implementation</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="15">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="16">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="17">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="18">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> class_methods do</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="19">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def pg_search(</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="20">
|
|
|
|
|
|
<code class="ruby"> fields: [],</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="21">
|
|
|
|
|
|
<code class="ruby"> fields_mappings: {}, </code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="22">
|
|
|
|
|
|
<code class="ruby"> cache: nil,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="23">
|
|
|
|
|
|
<code class="ruby"> language: 'english',</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="24">
|
|
|
|
|
|
<code class="ruby"> scope: 'scope_search',</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="25">
|
|
|
|
|
|
<code class="ruby"> skip_callback: false,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="26">
|
|
|
|
|
|
<code class="ruby"> wildcard: true,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="27">
|
|
|
|
|
|
<code class="ruby"> external_cache_data: nil,</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="28">
|
|
|
|
|
|
<code class="ruby"> joins: [],</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="29">
|
|
|
|
|
|
<code class="ruby"> default_field: ""</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="30">
|
|
|
|
|
|
<code class="ruby"> )</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="31">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> @ts_search_fields = fields</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="32">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> @ts_search_fields_mappings = fields_mappings</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="33">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> @ts_cache_field = cache</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="34">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> @ts_language = language</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="35">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> @ts_scope_method = scope</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="36">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> @ts_skip_cache_update = skip_callback</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="37">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> @ts_wildcard = wildcard</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="38">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> @ts_joins = joins</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="39">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> @default_field = default_field.to_s.empty? ? fields.first : default_field.to_sym</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="40">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> ts_add_scope</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="41">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="42">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="43">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def ts_add_scope</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="44">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> class_eval do</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="45">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> scope ts_scope_method, ->(value) do</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="24" data-linenumber="46">
|
|
<span class="hits">24</span>
|
|
|
|
<code class="ruby"> resulting_ids = ts_search(value).map(&:id)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="23" data-linenumber="47">
|
|
<span class="hits">23</span>
|
|
|
|
<code class="ruby"> where(id: resulting_ids)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="48">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="49">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="50">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="51">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="52">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def ts_search(value)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="24" data-linenumber="53">
|
|
<span class="hits">24</span>
|
|
|
|
<code class="ruby"> return if @ts_search_fields.blank? || value.blank?</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="54">
|
|
|
|
|
|
<code class="ruby"> includes(@ts_joins).references(:all).where(</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="24" data-linenumber="55">
|
|
<span class="hits">24</span>
|
|
|
|
<code class="ruby"> TextToSqlQuery.new(value, @ts_search_fields, @default_field, @ts_search_fields_mappings).where_clause).distinct</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="56">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="57">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="58">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def should_update_cache_field?</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="59">
|
|
|
|
|
|
<code class="ruby"> !@ts_skip_cache_update && @ts_cache_field.present?</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="60">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="61">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="62">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def ts_cache_field</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="16" data-linenumber="63">
|
|
<span class="hits">16</span>
|
|
|
|
<code class="ruby"> @ts_cache_field</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="64">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="65">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="66">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def ts_scope_method</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="67">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> @ts_scope_method</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="68">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="69">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="70">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def ts_cache_method</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="71">
|
|
|
|
|
|
<code class="ruby"> @ts_cache_method</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="72">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="73">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="74">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def ts_fields_to_vector(extra_data = [])</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="75">
|
|
|
|
|
|
<code class="ruby"> field_to_vector = ->(field) { "to_tsvector('#{@ts_language}', coalesce(#{field}::text, ''))" }</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="76">
|
|
|
|
|
|
<code class="ruby"> data_to_vector = ->(data) { "to_tsvector('#{@ts_language}', '#{data}')" }</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="77">
|
|
|
|
|
|
<code class="ruby"> (@ts_search_fields.map(&field_to_vector) + extra_data.map(&data_to_vector)).join(' || ')</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="78">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="79">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="80">
|
|
|
|
|
|
<code class="ruby">end</code>
|
|
</li>
|
|
|
|
</ol>
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div class="source_table" id="ce19b53ff8fa35fd6a57aa6b7ede25d3648dd01c">
|
|
<div class="header">
|
|
<h3>lib/text_to_sql_query.rb</h3>
|
|
<h4><span class="green">92.86 %</span> covered</h4>
|
|
<div>
|
|
<b>56</b> relevant lines.
|
|
<span class="green"><b>52</b> lines covered</span> and
|
|
<span class="red"><b>4</b> lines missed.</span>
|
|
</div>
|
|
</div>
|
|
|
|
<pre>
|
|
<ol>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="1">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">require_relative 'parser'</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="2">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="3">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">class TextToSqlQuery</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="4">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def initialize(text, fields, default_field, fields_mappings = {})</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="44" data-linenumber="5">
|
|
<span class="hits">44</span>
|
|
|
|
<code class="ruby"> @text = text.to_s.strip</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="44" data-linenumber="6">
|
|
<span class="hits">44</span>
|
|
|
|
<code class="ruby"> @fields = fields.map(&:to_sym)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="44" data-linenumber="7">
|
|
<span class="hits">44</span>
|
|
|
|
<code class="ruby"> @default_field = default_field.to_sym</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="44" data-linenumber="8">
|
|
<span class="hits">44</span>
|
|
|
|
<code class="ruby"> @fields_mappings = fields_mappings.merge(@fields.reduce({}) do |mappings, field|</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="114" data-linenumber="9">
|
|
<span class="hits">114</span>
|
|
|
|
<code class="ruby"> _table_name, field_name = field.to_s.split('.')</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="114" data-linenumber="10">
|
|
<span class="hits">114</span>
|
|
|
|
<code class="ruby"> mappings[field_name.to_sym] = field</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="114" data-linenumber="11">
|
|
<span class="hits">114</span>
|
|
|
|
<code class="ruby"> mappings</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="12">
|
|
|
|
|
|
<code class="ruby"> end)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="44" data-linenumber="13">
|
|
<span class="hits">44</span>
|
|
|
|
<code class="ruby"> fields_mappings.each do |field, value|</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="14">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> @fields_mappings[field] = value if @fields_mappings[field]</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="15">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="16">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="17">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="18">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def where_clause</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="44" data-linenumber="19">
|
|
<span class="hits">44</span>
|
|
|
|
<code class="ruby"> @parser = Query.new</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="44" data-linenumber="20">
|
|
<span class="hits">44</span>
|
|
|
|
<code class="ruby"> @parsed_tree = @parser.parse(@text)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="44" data-linenumber="21">
|
|
<span class="hits">44</span>
|
|
|
|
<code class="ruby"> generate_sql @parsed_tree</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="22">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="23">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="24">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> private</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="25">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="26">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def generate_sql(tree)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="128" data-linenumber="27">
|
|
<span class="hits">128</span>
|
|
|
|
<code class="ruby"> first_key = tree.keys.first</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="128" data-linenumber="28">
|
|
<span class="hits">128</span>
|
|
|
|
<code class="ruby"> node_value = tree[first_key]</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="128" data-linenumber="29">
|
|
<span class="hits">128</span>
|
|
|
|
<code class="ruby"> case first_key</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="30">
|
|
|
|
|
|
<code class="ruby"> when :DEFAULT_COLUMN</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="23" data-linenumber="31">
|
|
<span class="hits">23</span>
|
|
|
|
<code class="ruby"> escaped_node_value = handle_special_chars node_value</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="23" data-linenumber="32">
|
|
<span class="hits">23</span>
|
|
|
|
<code class="ruby"> ["CAST(#{@default_field.to_s} AS TEXT) ILIKE ?", "%#{escaped_node_value}%"]</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="33">
|
|
|
|
|
|
<code class="ruby"> when :OPERATOR_OR</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="22" data-linenumber="34">
|
|
<span class="hits">22</span>
|
|
|
|
<code class="ruby"> generate_expression_for_logical_operator(:OR, node_value)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="35">
|
|
|
|
|
|
<code class="ruby"> when :OPERATOR_AND</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="15" data-linenumber="36">
|
|
<span class="hits">15</span>
|
|
|
|
<code class="ruby"> generate_expression_for_logical_operator(:AND, node_value)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="37">
|
|
|
|
|
|
<code class="ruby"> when :OPERATOR_NOT</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="10" data-linenumber="38">
|
|
<span class="hits">10</span>
|
|
|
|
<code class="ruby"> not_array = generate_sql node_value</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="39">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="10" data-linenumber="40">
|
|
<span class="hits">10</span>
|
|
|
|
<code class="ruby"> if not_array.length < 2</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="41">
|
|
|
|
|
|
<code class="ruby"> raise "There should be more than 1 element for expression following NOT operator"</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="42">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="43">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="10" data-linenumber="44">
|
|
<span class="hits">10</span>
|
|
|
|
<code class="ruby"> not_expression = not_array.shift</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="10" data-linenumber="45">
|
|
<span class="hits">10</span>
|
|
|
|
<code class="ruby"> not_params = not_array</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="46">
|
|
|
|
|
|
<code class="ruby"> </code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="10" data-linenumber="47">
|
|
<span class="hits">10</span>
|
|
|
|
<code class="ruby"> ["NOT #{not_expression}"] + not_params</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="48">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="49">
|
|
|
|
|
|
<code class="ruby"> else</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="50">
|
|
|
|
|
|
<code class="ruby"> # key is column name</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="58" data-linenumber="51">
|
|
<span class="hits">58</span>
|
|
|
|
<code class="ruby"> escaped_node_value = handle_special_chars node_value</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="58" data-linenumber="52">
|
|
<span class="hits">58</span>
|
|
|
|
<code class="ruby"> mapping = @fields_mappings[first_key.to_sym]</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="58" data-linenumber="53">
|
|
<span class="hits">58</span>
|
|
|
|
<code class="ruby"> if mapping.nil?</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="2" data-linenumber="54">
|
|
<span class="hits">2</span>
|
|
|
|
<code class="ruby"> raise "Unknown field '#{first_key.to_s}'"</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="55">
|
|
|
|
|
|
<code class="ruby"> else</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="56" data-linenumber="56">
|
|
<span class="hits">56</span>
|
|
|
|
<code class="ruby"> ["CAST(#{mapping.to_s} AS TEXT) ILIKE ?", "%#{escaped_node_value}%"]</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="57">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="58">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="59">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="60">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="61">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def generate_expression_for_logical_operator(operator, operator_array)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="37" data-linenumber="62">
|
|
<span class="hits">37</span>
|
|
|
|
<code class="ruby"> if operator_array.length != 2</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="63">
|
|
|
|
|
|
<code class="ruby"> raise "There should be two array elements for #{operator.to_s} operator"</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="64">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="65">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="37" data-linenumber="66">
|
|
<span class="hits">37</span>
|
|
|
|
<code class="ruby"> first_operand = generate_sql operator_array.first</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="37" data-linenumber="67">
|
|
<span class="hits">37</span>
|
|
|
|
<code class="ruby"> second_operand = generate_sql operator_array.last</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="68">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="37" data-linenumber="69">
|
|
<span class="hits">37</span>
|
|
|
|
<code class="ruby"> if first_operand.length < 2</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="70">
|
|
|
|
|
|
<code class="ruby"> raise 'There should be more than 1 element in first operand array'</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="71">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="72">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="37" data-linenumber="73">
|
|
<span class="hits">37</span>
|
|
|
|
<code class="ruby"> if second_operand.length < 2</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="74">
|
|
|
|
|
|
<code class="ruby"> raise 'There should be more than 1 element in second operand array'</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="75">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="76">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="37" data-linenumber="77">
|
|
<span class="hits">37</span>
|
|
|
|
<code class="ruby"> first_operand_expression = first_operand.shift</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="37" data-linenumber="78">
|
|
<span class="hits">37</span>
|
|
|
|
<code class="ruby"> first_operand_params = first_operand</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="79">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="37" data-linenumber="80">
|
|
<span class="hits">37</span>
|
|
|
|
<code class="ruby"> second_operand_expression = second_operand.shift</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="37" data-linenumber="81">
|
|
<span class="hits">37</span>
|
|
|
|
<code class="ruby"> second_operand_params = second_operand</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="82">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="37" data-linenumber="83">
|
|
<span class="hits">37</span>
|
|
|
|
<code class="ruby"> ["(#{first_operand_expression} #{operator.to_s} #{second_operand_expression})"] + first_operand_params + second_operand_params</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="84">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="85">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="86">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def handle_special_chars(text)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="81" data-linenumber="87">
|
|
<span class="hits">81</span>
|
|
|
|
<code class="ruby"> result = text.gsub(/\"/, '')</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="81" data-linenumber="88">
|
|
<span class="hits">81</span>
|
|
|
|
<code class="ruby"> result.gsub!(/\_/, '\_')</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="81" data-linenumber="89">
|
|
<span class="hits">81</span>
|
|
|
|
<code class="ruby"> result.tr!('\\', '\\')</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="81" data-linenumber="90">
|
|
<span class="hits">81</span>
|
|
|
|
<code class="ruby"> result.gsub!(/%/, '\%')</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="81" data-linenumber="91">
|
|
<span class="hits">81</span>
|
|
|
|
<code class="ruby"> result</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="92">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="93">
|
|
|
|
|
|
<code class="ruby">end</code>
|
|
</li>
|
|
|
|
</ol>
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div class="source_table" id="1f620dc5aa56fc59374eab391bb6c70e9b12c49b">
|
|
<div class="header">
|
|
<h3>lib/text_to_tsquery.rb</h3>
|
|
<h4><span class="red">33.96 %</span> covered</h4>
|
|
<div>
|
|
<b>53</b> relevant lines.
|
|
<span class="green"><b>18</b> lines covered</span> and
|
|
<span class="red"><b>35</b> lines missed.</span>
|
|
</div>
|
|
</div>
|
|
|
|
<pre>
|
|
<ol>
|
|
|
|
<li class="never" data-hits="" data-linenumber="1">
|
|
|
|
|
|
<code class="ruby"># frozen_string_literal: true</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="2">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="3">
|
|
|
|
|
|
<code class="ruby"># transforms "english like" text queries into a tsquery operation</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="4">
|
|
|
|
|
|
<code class="ruby"># https://www.postgresql.org/docs/9.5/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="5">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">class TextToTsquery</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="6">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> attr_reader :text</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="7">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="8">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def initialize(text, wildcard: true)</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="9">
|
|
|
|
|
|
<code class="ruby"> @text = text.to_s.strip</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="10">
|
|
|
|
|
|
<code class="ruby"> @wildcard = wildcard</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="11">
|
|
|
|
|
|
<code class="ruby"> @exact_matches = []</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="12">
|
|
|
|
|
|
<code class="ruby"> validate!</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="13">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="14">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="15">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> EXACT_WORD_CHAR = '§'.freeze</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="16">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="17">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def tsquery</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="18">
|
|
|
|
|
|
<code class="ruby"> @tsquery = @text</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="19">
|
|
|
|
|
|
<code class="ruby"> strip_exact_words</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="20">
|
|
|
|
|
|
<code class="ruby"> remove_duplicated_spaces</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="21">
|
|
|
|
|
|
<code class="ruby"> transform_or_into_operator</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="22">
|
|
|
|
|
|
<code class="ruby"> transform_and_into_operator</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="23">
|
|
|
|
|
|
<code class="ruby"> strip_spaces_from_parenthesis</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="24">
|
|
|
|
|
|
<code class="ruby"> transform_remaining_spaces_into_and_operator</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="25">
|
|
|
|
|
|
<code class="ruby"> transform_keywords</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="26">
|
|
|
|
|
|
<code class="ruby"> join_operators_with_and</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="27">
|
|
|
|
|
|
<code class="ruby"> remove_partial_match_from_not_keywords</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="28">
|
|
|
|
|
|
<code class="ruby"> add_exact_words</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="29">
|
|
|
|
|
|
<code class="ruby"> @tsquery</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="30">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="31">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="32">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def validate!</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="33">
|
|
|
|
|
|
<code class="ruby"> parenthesis_error unless self.class.valid_search_parenthesis?(@text)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="34">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="35">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="36">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def self.valid_search_parenthesis?(text)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="37">
|
|
|
|
|
|
<code class="ruby"> text.split('').reduce(0) do |acc, char|</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="38">
|
|
|
|
|
|
<code class="ruby"> return false if acc < 0</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="39">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="40">
|
|
|
|
|
|
<code class="ruby"> if char == '('</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="41">
|
|
|
|
|
|
<code class="ruby"> acc + 1</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="42">
|
|
|
|
|
|
<code class="ruby"> elsif char == ')'</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="43">
|
|
|
|
|
|
<code class="ruby"> acc - 1</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="44">
|
|
|
|
|
|
<code class="ruby"> else</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="45">
|
|
|
|
|
|
<code class="ruby"> acc</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="46">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="47">
|
|
|
|
|
|
<code class="ruby"> end.zero?</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="48">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="49">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="50">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def parenthesis_error</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="51">
|
|
|
|
|
|
<code class="ruby"> raise ArgumentError, "incorrect number/order of parenthesis in search query: '#{@text}'"</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="52">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="53">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="54">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def strip_exact_words</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="55">
|
|
|
|
|
|
<code class="ruby"> @exact_matches << Regexp.last_match(1) while @tsquery.sub!(/"(.*?)"/, EXACT_WORD_CHAR)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="56">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="57">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="58">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def remove_duplicated_spaces</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="59">
|
|
|
|
|
|
<code class="ruby"> @tsquery = @tsquery.gsub(/\s+/, ' ')</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="60">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="61">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="62">
|
|
|
|
|
|
<code class="ruby"> # transforms or/OR/|/|| into | operator</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="63">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def transform_or_into_operator</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="64">
|
|
|
|
|
|
<code class="ruby"> @tsquery = @tsquery.gsub(/ ((or|\|+) )+/i, '|').gsub(/ *\|+ */, '|')</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="65">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="66">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="67">
|
|
|
|
|
|
<code class="ruby"> # transforms and/AND/&/&& into & operator</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="68">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def transform_and_into_operator</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="69">
|
|
|
|
|
|
<code class="ruby"> @tsquery = @tsquery.gsub(/ ((and|\&+) )+/i, '&')</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="70">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="71">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="72">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def strip_spaces_from_parenthesis</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="73">
|
|
|
|
|
|
<code class="ruby"> @tsquery = @tsquery.gsub(/ *([()]) */, '\1')</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="74">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="75">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="76">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def transform_remaining_spaces_into_and_operator</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="77">
|
|
|
|
|
|
<code class="ruby"> @tsquery = @tsquery.tr(' ', '&')</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="78">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="79">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="80">
|
|
|
|
|
|
<code class="ruby"> # adds :* for partial match of words</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="81">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def transform_keywords</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="82">
|
|
|
|
|
|
<code class="ruby"> keyword = @wildcard ? '\1:*' : '\1:'</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="83">
|
|
|
|
|
|
<code class="ruby"> @tsquery = @tsquery.gsub(/([^#{EXACT_WORD_CHAR}|&!())]+)/, keyword)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="84">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="85">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="86">
|
|
|
|
|
|
<code class="ruby"> # adds & between operations</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="87">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def join_operators_with_and</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="88">
|
|
|
|
|
|
<code class="ruby"> @tsquery = @tsquery.gsub(/:(\**)\!/, ':\1&!').gsub(/:(\**)\(/, ':\1&(').gsub(/\&+/, '&')</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="89">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="90">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="91">
|
|
|
|
|
|
<code class="ruby"> # removes partial match from NOT operations</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="92">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def remove_partial_match_from_not_keywords</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="93">
|
|
|
|
|
|
<code class="ruby"> @tsquery = @tsquery.gsub(/\!([^|&!())]+):\**/, '!\1')</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="94">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="95">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="96">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def add_exact_words</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="97">
|
|
|
|
|
|
<code class="ruby"> @exact_matches.each { |phrase| @tsquery = @tsquery.sub(EXACT_WORD_CHAR, "'#{phrase}'") }</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="98">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="99">
|
|
|
|
|
|
<code class="ruby">end</code>
|
|
</li>
|
|
|
|
</ol>
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|