Module: Nativepluck

Defined in:
lib/nativepluck/version.rb,
lib/nativepluck.rb

Overview

Copyright 2018 Ohad Dahan, Al Chou

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Defined Under Namespace

Modules: InstanceMethods

Constant Summary collapse

VERSION =
"0.2.1"

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.nativepluck_initObject

Returns the value of attribute nativepluck_init.



23
24
25
# File 'lib/nativepluck.rb', line 23

def nativepluck_init
  @nativepluck_init
end

.nativepluck_type_map_for_queriesObject

Returns the value of attribute nativepluck_type_map_for_queries.



21
22
23
# File 'lib/nativepluck.rb', line 21

def nativepluck_type_map_for_queries
  @nativepluck_type_map_for_queries
end

.nativepluck_type_map_for_resultsObject

Returns the value of attribute nativepluck_type_map_for_results.



21
22
23
# File 'lib/nativepluck.rb', line 21

def nativepluck_type_map_for_results
  @nativepluck_type_map_for_results
end

.original_type_map_for_queriesObject

Returns the value of attribute original_type_map_for_queries.



22
23
24
# File 'lib/nativepluck.rb', line 22

def original_type_map_for_queries
  @original_type_map_for_queries
end

.original_type_map_for_resultsObject

Returns the value of attribute original_type_map_for_results.



22
23
24
# File 'lib/nativepluck.rb', line 22

def original_type_map_for_results
  @original_type_map_for_results
end

.override_pluckObject

Returns the value of attribute override_pluck.



23
24
25
# File 'lib/nativepluck.rb', line 23

def override_pluck
  @override_pluck
end

Class Method Details

.init_nativepluckObject



28
29
30
31
32
33
34
35
# File 'lib/nativepluck.rb', line 28

def self.init_nativepluck
  return if @nativepluck_init
  @nativepluck_type_map_for_results = PG::BasicTypeMapForResults.new ActiveRecord::Base.connection.raw_connection
  @nativepluck_type_map_for_queries = PG::BasicTypeMapForQueries.new ActiveRecord::Base.connection.raw_connection
  @original_type_map_for_results    = ActiveRecord::Base.connection.raw_connection.type_map_for_results
  @original_type_map_for_queries    = ActiveRecord::Base.connection.raw_connection.type_map_for_queries
  @nativepluck_init = true
end

.nativepluck(input) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/nativepluck.rb', line 49

def self.nativepluck(input)
  out = []
  begin
    sql = input.respond_to?(:to_sql) ? input.to_sql : input
    Nativepluck.set_pg_native_casters
    results = ActiveRecord::Base.connection.raw_connection.async_exec(sql)
    results.nfields == 1 ? out = results.column_values(0) : out = results.values
  ensure
    results.try(:clear)
    Nativepluck.return_original_casters
  end
  return out
end

.return_original_castersObject



43
44
45
46
47
# File 'lib/nativepluck.rb', line 43

def self.return_original_casters
  init_nativepluck
  ActiveRecord::Base.connection.raw_connection.type_map_for_results = Nativepluck.original_type_map_for_results
  ActiveRecord::Base.connection.raw_connection.type_map_for_queries = Nativepluck.original_type_map_for_queries
end

.set_override_pluck(selection) ⇒ Object

Raises:

  • (ArgumentError)


94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/nativepluck.rb', line 94

def self.set_override_pluck(selection)
  raise ArgumentError.new("#{__method__}:: Input should be true/false and not #{selection.class}") unless (selection.is_a?(TrueClass) || selection.is_a?(FalseClass))

  if selection
    ::ActiveRecord::Calculations.class_eval do
      alias_method :orig_pluck, :pluck
      alias_method :pluck, :nativepluck
    end
    ::ActiveRecord::Querying.class_eval do
      alias_method :orig_pluck, :pluck
      alias_method :pluck, :nativepluck
    end
  else
    unless Nativepluck.override_pluck
      raise ArgumentError.new("#{__method__}:: Cannot turn off pluck overriding since it wasn't set yet")
    end
    ::ActiveRecord::Calculations.class_eval do
      alias_method :pluck, :orig_pluck
    end
    ::ActiveRecord::Querying.class_eval do
      alias_method :pluck, :orig_pluck
    end
  end
  Nativepluck.override_pluck = selection
end

.set_pg_native_castersObject



37
38
39
40
41
# File 'lib/nativepluck.rb', line 37

def self.set_pg_native_casters
  init_nativepluck
  ActiveRecord::Base.connection.raw_connection.type_map_for_results = Nativepluck.nativepluck_type_map_for_results
  ActiveRecord::Base.connection.raw_connection.type_map_for_queries = Nativepluck.nativepluck_type_map_for_queries
end