1606 lines
47 KiB
HTML
1606 lines
47 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-01-17T14:52:59+01:00">2020-01-17T14:52:59+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">68.94%</span></span>
|
|
covered at
|
|
<span class="covered_strength">
|
|
<span class="green">
|
|
5.11
|
|
</span>
|
|
</span> hits/line)
|
|
</h2>
|
|
<a name="AllFiles"></a>
|
|
<div>
|
|
<b>3</b> files in total.
|
|
<b>132</b> relevant lines.
|
|
<span class="green"><b>91</b> lines covered</span> and
|
|
<span class="red"><b>41</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="#753228502df7d7eba3c0631f5c2586671ab90064" class="src_link" title="lib/pg_searchable_regex.rb">lib/pg_searchable_regex.rb</a></td>
|
|
<td class="yellow strong">84.21 %</td>
|
|
<td>76</td>
|
|
<td>38</td>
|
|
<td>32</td>
|
|
<td>6</td>
|
|
<td>7.3</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="strong"><a href="#e8ee935d8bdd18586008a6e7f179fcb3e6b45ccd" class="src_link" title="lib/text_to_regex_query.rb">lib/text_to_regex_query.rb</a></td>
|
|
<td class="green strong">100.0 %</td>
|
|
<td>66</td>
|
|
<td>41</td>
|
|
<td>41</td>
|
|
<td>0</td>
|
|
<td>9.3</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="753228502df7d7eba3c0631f5c2586671ab90064">
|
|
<div class="header">
|
|
<h3>lib/pg_searchable_regex.rb</h3>
|
|
<h4><span class="yellow">84.21 %</span> covered</h4>
|
|
<div>
|
|
<b>38</b> relevant lines.
|
|
<span class="green"><b>32</b> lines covered</span> and
|
|
<span class="red"><b>6</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_regex_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="12" data-linenumber="12">
|
|
<span class="hits">12</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="12" data-linenumber="31">
|
|
<span class="hits">12</span>
|
|
|
|
<code class="ruby"> @ts_search_fields = fields</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="12" data-linenumber="32">
|
|
<span class="hits">12</span>
|
|
|
|
<code class="ruby"> @ts_search_fields_mappings = fields_mappings</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="12" data-linenumber="33">
|
|
<span class="hits">12</span>
|
|
|
|
<code class="ruby"> @ts_cache_field = cache</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="12" data-linenumber="34">
|
|
<span class="hits">12</span>
|
|
|
|
<code class="ruby"> @ts_language = language</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="12" data-linenumber="35">
|
|
<span class="hits">12</span>
|
|
|
|
<code class="ruby"> @ts_scope_method = scope</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="12" data-linenumber="36">
|
|
<span class="hits">12</span>
|
|
|
|
<code class="ruby"> @ts_skip_cache_update = skip_callback</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="12" data-linenumber="37">
|
|
<span class="hits">12</span>
|
|
|
|
<code class="ruby"> @ts_wildcard = wildcard</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="12" data-linenumber="38">
|
|
<span class="hits">12</span>
|
|
|
|
<code class="ruby"> @ts_joins = joins</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="12" data-linenumber="39">
|
|
<span class="hits">12</span>
|
|
|
|
<code class="ruby"> @default_field = (default_field.to_sym || fields.first)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="12" data-linenumber="40">
|
|
<span class="hits">12</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="12" data-linenumber="44">
|
|
<span class="hits">12</span>
|
|
|
|
<code class="ruby"> class_eval do</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="43" data-linenumber="45">
|
|
<span class="hits">43</span>
|
|
|
|
<code class="ruby"> scope ts_scope_method, ->(value) { ts_search(value) }</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="46">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="47">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="48">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="49">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def ts_search(value)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="31" data-linenumber="50">
|
|
<span class="hits">31</span>
|
|
|
|
<code class="ruby"> return if @ts_search_fields.blank? || value.blank?</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="30" data-linenumber="51">
|
|
<span class="hits">30</span>
|
|
|
|
<code class="ruby"> TextToRegexQuery.new(value, @ts_search_fields, @default_field, @ts_search_fields_mappings).where_clause( includes(@ts_joins).references(:all))</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 should_update_cache_field?</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="55">
|
|
|
|
|
|
<code class="ruby"> !@ts_skip_cache_update && @ts_cache_field.present?</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 ts_cache_field</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="59">
|
|
|
|
|
|
<code class="ruby"> @ts_cache_field</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_scope_method</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="12" data-linenumber="63">
|
|
<span class="hits">12</span>
|
|
|
|
<code class="ruby"> @ts_scope_method</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_cache_method</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="67">
|
|
|
|
|
|
<code class="ruby"> @ts_cache_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_fields_to_vector(extra_data = [])</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="71">
|
|
|
|
|
|
<code class="ruby"> field_to_vector = ->(field) { "to_tsvector('#{@ts_language}', coalesce(#{field}::text, ''))" }</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="72">
|
|
|
|
|
|
<code class="ruby"> data_to_vector = ->(data) { "to_tsvector('#{@ts_language}', '#{data}')" }</code>
|
|
</li>
|
|
|
|
<li class="missed" data-hits="0" data-linenumber="73">
|
|
|
|
|
|
<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="74">
|
|
|
|
|
|
<code class="ruby"> end</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">end</code>
|
|
</li>
|
|
|
|
</ol>
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div class="source_table" id="e8ee935d8bdd18586008a6e7f179fcb3e6b45ccd">
|
|
<div class="header">
|
|
<h3>lib/text_to_regex_query.rb</h3>
|
|
<h4><span class="green">100.0 %</span> covered</h4>
|
|
<div>
|
|
<b>41</b> relevant lines.
|
|
<span class="green"><b>41</b> lines covered</span> and
|
|
<span class="red"><b>0</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 where clause with regex</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="never" data-hits="" data-linenumber="5">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="6">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby">class TextToRegexQuery</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="7">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def initialize(text, fields, default_field, fields_mappings = {})</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="35" data-linenumber="8">
|
|
<span class="hits">35</span>
|
|
|
|
<code class="ruby"> @text = text.to_s.strip</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="35" data-linenumber="9">
|
|
<span class="hits">35</span>
|
|
|
|
<code class="ruby"> @fields = fields.map(&:to_sym)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="35" data-linenumber="10">
|
|
<span class="hits">35</span>
|
|
|
|
<code class="ruby"> @default_field = default_field.to_sym</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="35" data-linenumber="11">
|
|
<span class="hits">35</span>
|
|
|
|
<code class="ruby"> @fields_mappings = fields_mappings.merge(@fields.reduce({}) do |mappings, field|</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="37" data-linenumber="12">
|
|
<span class="hits">37</span>
|
|
|
|
<code class="ruby"> table_name, field_name = field.to_s.split(".")</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="37" data-linenumber="13">
|
|
<span class="hits">37</span>
|
|
|
|
<code class="ruby"> mappings[field_name.to_sym] = field</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="7" data-linenumber="14">
|
|
<span class="hits">7</span>
|
|
|
|
<code class="ruby"> mappings </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(query)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="19">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> @cleared_text = @text.dup</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="20">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> @column_chunks = []</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="21">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> remove_duplicated_spaces</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="22">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> extract_columns</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="23">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> escape_special_characters</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="24">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> generate_where_clause(query)</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">private</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"> def remove_duplicated_spaces</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="30">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> @cleared_text.gsub!(/\s+/, ' ')</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="31">
|
|
|
|
|
|
<code class="ruby"> end</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 escape_special_characters</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="34">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> @cleared_text.gsub!(/\_/, '\_')</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="35">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> @cleared_text.tr!('\\', '\\')</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="36">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> @cleared_text.gsub!(/%/, '\%')</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"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="1" data-linenumber="39">
|
|
<span class="hits">1</span>
|
|
|
|
<code class="ruby"> def extract_columns</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="40">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> column_search_term_pairs = @cleared_text.scan(/([A-Za-z0-9_]+:[\w\_-]+)/)</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="41">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="42">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> @column_chunks = (column_search_term_pairs.flatten.map do |pair|</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="7" data-linenumber="43">
|
|
<span class="hits">7</span>
|
|
|
|
<code class="ruby"> column, term = pair.split(':')</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="7" data-linenumber="44">
|
|
<span class="hits">7</span>
|
|
|
|
<code class="ruby"> next unless @fields_mappings.include?(column.to_sym) </code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="45">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> @cleared_text.gsub!(pair, '')</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="46">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> { @fields_mappings[column.to_sym] => term }</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="47">
|
|
|
|
|
|
<code class="ruby"> end).compact</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="48">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> unless @cleared_text.strip.empty?</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="3" data-linenumber="49">
|
|
<span class="hits">3</span>
|
|
|
|
<code class="ruby"> @column_chunks = [{ @default_field.to_s => @cleared_text.strip }] + @column_chunks</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="50">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="51">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> @column_chunks</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 generate_where_clause(query)</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="55">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> where_clause = ''</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="56">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> columns = @column_chunks.map { |c| c.keys.first } </code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="13" data-linenumber="57">
|
|
<span class="hits">13</span>
|
|
|
|
<code class="ruby"> values = @column_chunks.map { |c| c.values.first }</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="58">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="59">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> columns.each do |column| </code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="8" data-linenumber="60">
|
|
<span class="hits">8</span>
|
|
|
|
<code class="ruby"> where_clause += "#{column} LIKE ? OR "</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="61">
|
|
|
|
|
|
<code class="ruby"> end</code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="62">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> where_clause += " 1<>1 "</code>
|
|
</li>
|
|
|
|
<li class="never" data-hits="" data-linenumber="63">
|
|
|
|
|
|
<code class="ruby"></code>
|
|
</li>
|
|
|
|
<li class="covered" data-hits="5" data-linenumber="64">
|
|
<span class="hits">5</span>
|
|
|
|
<code class="ruby"> query.where([where_clause] + values) </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">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>
|