This repository has been archived by the owner on Nov 13, 2021. It is now read-only.
/
finder_methods.rb
84 lines (76 loc) · 3.18 KB
/
finder_methods.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
##
# Copyright 2012 Twitter, Inc
#
# 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.
##
module ReputationSystem
module FinderMethods
def self.included(klass)
klass.extend ClassMethods
end
module ClassMethods
def find_with_reputation(*args)
reputation_name, srn, find_scope, options = parse_query_args(*args)
options[:select] = build_select_statement(table_name, reputation_name, options[:select])
options[:joins] = build_join_statement(table_name, name, srn, options[:joins])
options[:conditions] = build_condition_statement(options[:conditions])
find(find_scope, options)
end
def count_with_reputation(*args)
reputation_name, srn, find_scope, options = parse_query_args(*args)
options[:joins] = build_join_statement(table_name, name, srn, options[:joins])
options[:conditions] = build_condition_statement(options[:conditions])
options[:conditions][0].gsub!(reputation_name.to_s, "COALESCE(rs_reputations.value, 0)")
count(find_scope, options)
end
def find_with_normalized_reputation(*args)
reputation_name, srn, find_scope, options = parse_query_args(*args)
options[:select] = build_select_statement(table_name, reputation_name, options[:select], srn, true)
options[:joins] = build_join_statement(table_name, name, srn, options[:joins])
options[:conditions] = build_condition_statement(options[:conditions])
find(find_scope, options)
end
def find_with_reputation_sql(*args)
reputation_name, srn, find_scope, options = parse_query_args(*args)
options[:select] = build_select_statement(table_name, reputation_name, options[:select])
options[:joins] = build_join_statement(table_name, name, srn, options[:joins])
options[:conditions] = build_condition_statement(options[:conditions])
if respond_to?(:construct_finder_sql, true)
construct_finder_sql(options)
else
construct_finder_arel(options).to_sql
end
end
protected
def parse_query_args(*args)
case args.length
when 2
find_scope = args[1]
options = {}
when 3
find_scope = args[1]
options = args[2]
when 4
scope = args[1]
find_scope = args[2]
options = args[3]
else
raise ArgumentError, "Expecting 2, 3 or 4 arguments but got #{args.length}"
end
reputation_name = args[0]
srn = ReputationSystem::Network.get_scoped_reputation_name(name, reputation_name, scope)
[reputation_name, srn, find_scope, options]
end
end
end
end