rails_age 0.6.2 → 0.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '01018a3efe8d4cef46fce365b6fd442882d8bf4ff51e0ad3d3bdb235db80ebb7'
4
- data.tar.gz: 69a20eb39f9609c6350463d6a391b7f08887079e51e56602a6357d914571ed8f
3
+ metadata.gz: e8bae6566d3be3dc932bc834d67b969ddab46efb5bc72dfde5b245a861f9c09f
4
+ data.tar.gz: 04ab7c0d236560abefbe9d637a24e5e027ada6a2f3c0279d4aace865262c5808
5
5
  SHA512:
6
- metadata.gz: cc2ea56dcb102213397ca5ffc19edc095341e51307b0500d0be7bc7595cb65f64e74c6490a678703f5faf903d0396010b63b8dd33e162ed218e038a4e95e05f5
7
- data.tar.gz: 30e0472fb006bf883cb57a5c7406571d4fc4715a9d6d96e792dd5d3b4998e538eab74f809b5d384072d88e77ce2d6fb143cdb6a5c20fd044fd74673edd2bb13a
6
+ metadata.gz: 6e2b16c1934dbdf79dce10028ee5d6066e93416a0ea2a31f378b2239db72383b11dec44a892a254721c75130f2b0fad5c4ab4a4dda0bdbf747ecb66bc695c8b7
7
+ data.tar.gz: 5883fcd0e9a36c965683ec01702b9a8e6b8d31e66d991ef2331c21ab11aa49c894965f666937d456dbd5fc7aaea1b35577f9f9c9b8115c4775a83bf18eed4354
data/CHANGELOG.md CHANGED
@@ -35,21 +35,22 @@ breaking change?: namespaces (by default) will use their own schema? (add to dat
35
35
  - **Age Path** - nodes and edges combined
36
36
  * add `rails generate apache_age:path_scaffold HasJob employee_role start_node:person end_node:company`
37
37
 
38
+ ## VERSION 0.6.4 - 2024-xx-xx
38
39
 
39
- ## VERSION 0.6.3 - 2024-xx-xx
40
+ - **Query Sanitize**:
41
+ * reject attributes not defined in model (throw error?)
42
+ * allow and sanitize query strings with multiple attributes, ie: `Person.where("find.first_name = ? AND find.last_name = ?", 'John', 'Doe')`
43
+
44
+ ## VERSION 0.6.3 - 2024-10-27
40
45
 
41
46
  - **Query Sanitize**:
42
- * reject attributes not defined in model
43
47
  * sanitize strings using: id(find) = ?, 23 & find.first_name = ?, 'John'
48
+ NOTE: this sanitization only works (so far) for strings containing ONE attribute. ie: `Person.where("find.first_name = ?", 'John')` or `Person.where("first_name = ?", 'John')` works but `Person.where("find.first_name = ? AND find.last_name = ?", 'John', 'Doe')` does not yet work
44
49
 
45
50
  ## VERSION 0.6.2 - 2024-09-30
46
51
 
47
52
  - **Query Sanitize**
48
- * hashes sanitized
49
-
50
- - **TODO**:
51
- * reject attributes not defined in model
52
- * sanitize strings using: id(find) = ?, 23 & find.first_name = ?, 'John'
53
+ * hash queries sanitized
53
54
 
54
55
  ## VERSION 0.6.1 - 2024-09-29
55
56
 
@@ -8,9 +8,9 @@ module ApacheAge
8
8
  instance
9
9
  end
10
10
 
11
- def where(attributes)
11
+ def where(*attributes)
12
12
  query_builder = QueryBuilder.new(self)
13
- query_builder.where(attributes)
13
+ query_builder.where(*attributes)
14
14
  end
15
15
 
16
16
  def all = QueryBuilder.new(self).all
@@ -41,32 +41,116 @@ module ApacheAge
41
41
  self
42
42
  end
43
43
 
44
- # TODO: need to handle string inputs too: instead of: \
45
- # "id(find) = #{id}" & "find.name = #{name}"
46
- # we can have: "id(find) = ?", id & "find.name = ?", name
47
- # ActiveRecord::Base.sanitize_sql([query_string, v])
48
- def where(attributes)
49
- return self if attributes.blank?
44
+ # # TODO: need to handle string inputs too: instead of: \
45
+ # # "id(find) = #{id}" & "find.name = #{name}"
46
+ # # we can have: "id(find) = ?", id & "find.name = ?", name
47
+ # # ActiveRecord::Base.sanitize_sql([query_string, v])
48
+ def where(*args)
49
+ return self if args.blank?
50
50
 
51
51
  @where_clauses <<
52
- if attributes.is_a?(String)
53
- if attributes.include?('id(') || attributes.include?('find.')
54
- attributes
52
+ # not able to sanitize the query string in this case
53
+ # ["first_name = 'Barney'"]
54
+ if args.length == 1 && args.first.is_a?(String)
55
+ string_query = args.first
56
+ if string_query.include?('id = ?')
57
+ "id(find) = ?"
58
+ elsif string_query.include?('id(') || string_query.include?('find.')
59
+ string_query
55
60
  else
56
- "find.#{attributes}"
61
+ "find.#{string_query}"
57
62
  end
58
- else
63
+
64
+ # Handling & sanitizing parameterized string queries
65
+ elsif args.length > 1 && args.first.is_a?(String)
66
+ raw_query_string = args.first
67
+ query_string =
68
+ if raw_query_string.include?('id = ?')
69
+ "id(find) = ?"
70
+ elsif raw_query_string.include?('id(') || raw_query_string.include?('find.')
71
+ raw_query_string
72
+ else
73
+ "find.#{raw_query_string}"
74
+ end
75
+ values = args[1..-1]
76
+ ActiveRecord::Base.sanitize_sql_array([query_string, *values])
77
+
78
+ # Hashes are sanitized in the model class
79
+ # [{:first_name=>"Barney", :last_name=>"Rubble", :gender=>"male"}]
80
+ elsif args.first.is_a?(Hash)
81
+ attributes = args.first
59
82
  edge_keys = [:start_id, :start_node, :end_id, :end_node]
60
83
  if edge_keys.any? { |key| attributes.include?(key) }
61
- model_class.send(:where_edge_clause, attributes)
84
+ model_class.send(:where_edge_clause, **attributes)
62
85
  else
63
- model_class.send(:where_node_clause, attributes)
86
+ model_class.send(:where_node_clause, **attributes)
64
87
  end
88
+
89
+ else
90
+ raise ArgumentError, "Invalid arguments for `where` method"
65
91
  end
66
92
 
67
93
  self
68
94
  end
69
95
 
96
+ # # where is sanitized in the model class with hash values
97
+ # def where(attributes)
98
+ # return self if attributes.blank?
99
+
100
+ # @where_clauses <<
101
+ # if attributes.is_a?(String)
102
+ # puts "HANDLE PURE STRING QUERIES"
103
+ # if attributes.include?('id(') || attributes.include?('find.')
104
+ # attributes
105
+ # else
106
+ # "find.#{attributes}"
107
+ # end
108
+ # else
109
+ # puts "HANDLE HASHES"
110
+ # pp attributes
111
+ # edge_keys = [:start_id, :start_node, :end_id, :end_node]
112
+ # if edge_keys.any? { |key| attributes.include?(key) }
113
+ # puts "HANDLE EDGE CLAUSES"
114
+ # model_class.send(:where_edge_clause, attributes)
115
+ # else
116
+ # puts "HANDLE NODE CLAUSES"
117
+ # model_class.send(:where_node_clause, attributes)
118
+ # end
119
+ # end
120
+
121
+ # self
122
+ # end
123
+
124
+ # # Pre-sanitize where statements
125
+ # # def where(*args)
126
+ # # return self if args.blank?
127
+
128
+ # # # Handling parameterized query strings with values
129
+ # # if args.length == 1 && args.first.is_a?(Hash)
130
+ # # # If a hash of attributes is provided, use the existing logic
131
+ # # attributes = args.first
132
+ # # edge_keys = [:start_id, :start_node, :end_id, :end_node]
133
+ # # if edge_keys.any? { |key| attributes.include?(key) }
134
+ # # @where_clauses << model_class.send(:where_edge_clause, attributes)
135
+ # # else
136
+ # # @where_clauses << model_class.send(:where_node_clause, attributes)
137
+ # # end
138
+ # # elsif args.length > 1 && args.first.is_a?(String)
139
+ # # # If a query string with placeholders and values is provided
140
+ # # query_string = args.first
141
+ # # values = args[1..-1]
142
+ # # sanitized_query = ActiveRecord::Base.send(:sanitize_sql_array, [query_string, *values])
143
+ # # @where_clauses << sanitized_query
144
+ # # elsif args.length == 1 && args.first.is_a?(String)
145
+ # # # If a single string is provided, use it directly (assuming it is already sanitized or trusted)
146
+ # # @where_clauses << args.first
147
+ # # else
148
+ # # raise ArgumentError, "Invalid arguments for `where` method"
149
+ # # end
150
+
151
+ # # self
152
+ # # end
153
+
70
154
  # New return method
71
155
  def return(*variables)
72
156
  return self if variables.blank?
@@ -1,3 +1,3 @@
1
1
  module RailsAge
2
- VERSION = '0.6.2'
2
+ VERSION = '0.6.3'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_age
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bill Tihen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-09-30 00:00:00.000000000 Z
11
+ date: 2024-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails