logical_query_parser 0.4.0 → 0.6.0

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: 21e876f1e9e4496b81a09656f8f9667817b79cc961fd72557dafd56ee20f7f37
4
- data.tar.gz: b44d2f653f33c10de26fa2f80010836291abe78804354b84bb9aa1c54f5210ac
3
+ metadata.gz: 50d9e7d0d793b457dd2561160c3fc0e2a0611d7425c671a624c19c5e7395fd92
4
+ data.tar.gz: cc8b9d94d8c13c5764e82b64be14d6b68e050f8d7fe9a3b53c624aa973dbb949
5
5
  SHA512:
6
- metadata.gz: 0b1337963075eb702293de0b3f9fb01880db2e2b7ed15b265858806fd5a75c25c0dd253c309060c7fa6982a8eda8e1b42d1ed82a3d978ac94a58f6169b9959e3
7
- data.tar.gz: 02a3028859413314aee0284ac1beda1355dd633101ed449c2029447277a5e3c8fd552afc683313f276e8bdd25f9a868f6fc8b1cbd443603c9f6ce422947f3104
6
+ metadata.gz: fd0590d955cba3c8b10d2441e62d720131bffb46ecbfbbf5df3ed49fc1e27aeb1a81a28e2ae18d3cdd50e553a0802a24b66b3c5d77b15395391bae7a18e095e4
7
+ data.tar.gz: 678c2067c0dae4587dde4158d251ccb7643479af9ff0c894be7c3410a02c2970a0e83ea8275a300d0ed2b89f08aaa98ddabd0332dca40e62033d00d65c76f208
@@ -4,71 +4,23 @@ on: [push, pull_request]
4
4
 
5
5
  jobs:
6
6
  test:
7
- runs-on: ubuntu-22.04
7
+ runs-on: ubuntu-24.04
8
8
  strategy:
9
9
  fail-fast: false
10
10
  matrix:
11
- ruby: [2.3, 2.4, 2.5, 2.6, 2.7, '3.0', 3.1, 3.2, 3.3]
12
- gemfile: ['rails42', 'rails50', 'rails51', 'rails52', 'rails60', 'rails61', 'rails70', 'rails71']
11
+ ruby: ['3.0', 3.1, 3.2, 3.3, 3.4, '4.0']
12
+ gemfile: ['rails70', 'rails71', 'rails72', 'rails80', 'rails81']
13
13
  exclude:
14
- - ruby: 2.3
15
- gemfile: rails60
16
- - ruby: 2.3
17
- gemfile: rails61
18
- - ruby: 2.3
19
- gemfile: rails70
20
- - ruby: 2.3
21
- gemfile: rails71
22
- - ruby: 2.4
23
- gemfile: rails60
24
- - ruby: 2.4
25
- gemfile: rails61
26
- - ruby: 2.4
27
- gemfile: rails70
28
- - ruby: 2.4
29
- gemfile: rails71
30
- - ruby: 2.5
31
- gemfile: rails70
32
- - ruby: 2.5
33
- gemfile: rails71
34
- - ruby: 2.6
35
- gemfile: rails70
36
- - ruby: 2.6
37
- gemfile: rails71
38
- - ruby: 2.7
39
- gemfile: rails42
40
14
  - ruby: 3.0
41
- gemfile: rails42
15
+ gemfile: rails72
42
16
  - ruby: 3.0
43
- gemfile: rails50
17
+ gemfile: rails80
44
18
  - ruby: 3.0
45
- gemfile: rails51
46
- - ruby: 3.0
47
- gemfile: rails52
48
- - ruby: 3.1
49
- gemfile: rails42
19
+ gemfile: rails81
50
20
  - ruby: 3.1
51
- gemfile: rails50
21
+ gemfile: rails80
52
22
  - ruby: 3.1
53
- gemfile: rails51
54
- - ruby: 3.1
55
- gemfile: rails52
56
- - ruby: 3.2
57
- gemfile: rails42
58
- - ruby: 3.2
59
- gemfile: rails50
60
- - ruby: 3.2
61
- gemfile: rails51
62
- - ruby: 3.2
63
- gemfile: rails52
64
- - ruby: 3.3
65
- gemfile: rails42
66
- - ruby: 3.3
67
- gemfile: rails50
68
- - ruby: 3.3
69
- gemfile: rails51
70
- - ruby: 3.3
71
- gemfile: rails52
23
+ gemfile: rails81
72
24
 
73
25
  name: ruby ${{ matrix.ruby }}, ${{ matrix.gemfile }}
74
26
 
@@ -76,11 +28,14 @@ jobs:
76
28
  BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
77
29
 
78
30
  steps:
79
- - uses: actions/checkout@v4
31
+ - uses: actions/checkout@v5
80
32
  - uses: ruby/setup-ruby@v1
81
33
  with:
82
34
  ruby-version: ${{ matrix.ruby }}
83
35
  bundler-cache: true
36
+ - name: Bundle list
37
+ run: |
38
+ bundle list
84
39
  - name: Run test
85
40
  run: |
86
41
  bundle exec rspec
data/.gitignore CHANGED
File without changes
data/.rspec CHANGED
File without changes
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.6.0
4
+
5
+ * Support multiple associations and alias table names for `search` method.
6
+ * Change join method from `joins` to `left_joins` for `search` method.
7
+
8
+ ## 0.5.0
9
+
10
+ * Drop support for ruby <= 2.7, rails <= 6.1.
11
+
3
12
  ## 0.4.0
4
13
 
5
14
  * Add `frozen_string_literal: true`.
data/CODE_OF_CONDUCT.md CHANGED
File without changes
data/Gemfile CHANGED
@@ -1,3 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
+
5
+ gem "activerecord", ">= 7.0.0"
6
+ gem "sqlite3"
data/LICENSE.txt CHANGED
File without changes
data/README.md CHANGED
@@ -4,9 +4,9 @@ A parser to generate a tree structure from a logical search query string using t
4
4
 
5
5
  ## Dependencies
6
6
 
7
- * ruby 2.3+
7
+ * ruby 3.0+
8
8
  * treetop 1.6+
9
- * activerecord 4.2+ (optional)
9
+ * activerecord 7.0+ (optional)
10
10
 
11
11
  ## Installation
12
12
 
@@ -99,16 +99,36 @@ Use with associations:
99
99
  ```ruby
100
100
  class Doc < ActiveRecord::Base
101
101
  has_many :tags
102
+ has_many :flags
102
103
  end
103
104
 
104
105
  class Tag < ActiveRecord::Base
106
+ belongs_to :doc
107
+ end
108
+
109
+ class Flag < ActiveRecord::Base
110
+ belongs_to :doc
105
111
  end
106
112
 
107
113
  LogicalQueryParser.search("a AND b", Doc.all, :c1, :c2, tags: [:c3]).to_sql
108
114
  # SELECT "docs".* FROM "docs"
109
- # INNER JOIN "tags" ON "tags"."doc_id" = "docs"."id"
115
+ # LEFT OUTER JOIN "tags" ON "tags"."doc_id" = "docs"."id"
110
116
  # WHERE ((("docs"."c1" LIKE '%a%' OR "docs"."c2" LIKE '%a%') OR "tags"."c3" LIKE '%a%') AND
111
117
  # (("docs"."c1" LIKE '%b%' OR "docs"."c2" LIKE '%b%') OR "tags"."c3" LIKE '%b%'))
118
+
119
+ LogicalQueryParser.search("a AND b", Doc.all, :c1, :c2, tags: [:c3], flags: [:c4]).to_sql
120
+ # SELECT "docs".* FROM "docs"
121
+ # LEFT OUTER JOIN "tags" ON "tags"."doc_id" = "docs"."id"
122
+ # LEFT OUTER JOIN "flags" ON "flags"."doc_id" = "docs"."id"
123
+ # WHERE (((("docs"."c1" LIKE '%a%' OR "docs"."c2" LIKE '%a%') OR "tags"."c3" LIKE '%a%') OR "flags"."c4" LIKE '%a%') AND
124
+ # ((("docs"."c1" LIKE '%b%' OR "docs"."c2" LIKE '%b%') OR "tags"."c3" LIKE '%b%') OR "flags"."c4" LIKE '%b%'))
125
+
126
+ LogicalQueryParser.search("a AND b", Doc.all, :c1, tags: [:c2, doc: [:c3]]).to_sql
127
+ # SELECT "docs".* FROM "docs"
128
+ # LEFT OUTER JOIN "tags" ON "tags"."doc_id" = "docs"."id"
129
+ # LEFT OUTER JOIN "docs" AS "docs_tags" ON "docs_tags"."id" = "tags"."doc_id"
130
+ # WHERE ((("docs"."c1" LIKE '%a%' OR "tags"."c2" LIKE '%a%') OR "docs_tags"."c3" LIKE '%a%') AND
131
+ # (("docs"."c1" LIKE '%b%' OR "tags"."c2" LIKE '%b%') OR "docs_tags"."c3" LIKE '%b%'))
112
132
  ```
113
133
 
114
134
  ## Contributing
data/Rakefile CHANGED
File without changes
@@ -1,6 +1,13 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem "rails", "~> 7.0.1"
3
+ gem "activerecord", "~> 7.0.1"
4
4
  gem "sqlite3", "~> 1.4.0"
5
5
 
6
+ gem "concurrent-ruby", "<= 1.3.4"
7
+
8
+ if RUBY_VERSION >= "3.4"
9
+ gem "bigdecimal"
10
+ gem "mutex_m"
11
+ end
12
+
6
13
  gemspec path: "../"
@@ -1,6 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem "rails", "~> 7.1.0"
3
+ gem "activerecord", "~> 7.1.0"
4
4
  gem "sqlite3", "~> 1.6.6"
5
5
 
6
6
  gemspec path: "../"
@@ -1,6 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem "rails", "~> 6.1.0"
4
- gem "sqlite3", "~> 1.4.0"
3
+ gem "activerecord", "~> 7.2.0"
4
+ gem "sqlite3"
5
5
 
6
6
  gemspec path: "../"
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "activerecord", "~> 8.0.0"
4
+ gem "sqlite3"
5
+
6
+ gemspec path: "../"
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "activerecord", "~> 8.1.0"
4
+ gem "sqlite3"
5
+
6
+ gemspec path: "../"
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LogicalQueryParser
4
+ class AssocNode
5
+ attr_accessor :klass, :assoc_name, :table_name, :columns, :parent, :children
6
+
7
+ def initialize(options = {})
8
+ options.each do |key, value|
9
+ send("#{key}=", value)
10
+ end
11
+ @columns ||= []
12
+ @children ||= []
13
+ end
14
+
15
+ def model=(model)
16
+ @klass = model
17
+ @table_name = model.table_name
18
+ end
19
+
20
+ def descendants
21
+ children.flat_map do |child|
22
+ [child] + child.descendants
23
+ end
24
+ end
25
+
26
+ def arel_table
27
+ Arel::Table.new(table_name, as: table_name)
28
+ end
29
+
30
+ def join_structure
31
+ if children.empty?
32
+ {}
33
+ else
34
+ children.each_with_object({}) do |child, hash|
35
+ hash[child.assoc_name] = child.join_structure
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,18 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'assoc'
3
+ require_relative 'assoc_node'
4
4
 
5
5
  module LogicalQueryParser
6
6
  class AssocResolver
7
- def initialize(klass)
8
- @klass = klass
7
+ def initialize(relation, *options)
8
+ @relation = relation
9
+ @options = options.flatten(1)
9
10
  end
10
11
 
11
- def run(*args)
12
- Assoc.new.tap do |assoc|
13
- assoc.current = assoc.structure
14
- resolve_assocs(@klass, args, assoc)
12
+ def call
13
+ root_node = AssocNode.new(klass: @relation.klass, table_name: @relation.table_name)
14
+ resolve_assocs(@relation.klass, root_node, @options)
15
+
16
+ join_relation = @relation.klass.unscoped.left_joins(root_node.join_structure)
17
+ root_node.descendants.each_with_index do |node, i|
18
+ join_source = join_relation.arel.join_sources[i]
19
+ node.table_name = join_source&.left&.name || node.klass.table_name
15
20
  end
21
+
22
+ root_node
16
23
  end
17
24
 
18
25
  private
@@ -25,24 +32,20 @@ module LogicalQueryParser
25
32
  end
26
33
  end
27
34
 
28
- def resolve_assocs(klass, options, assoc)
29
- options = wrap_array(options)
30
- options.each do |option|
31
- if option.is_a?(Hash)
32
- resolve_assocs_for_hash(klass, option, assoc)
35
+ def resolve_assocs(current_klass, node, options)
36
+ wrap_array(options).each do |column_or_assoc_hash|
37
+ if column_or_assoc_hash.is_a?(Hash)
38
+ column_or_assoc_hash.each do |assoc_name, nested_column_or_assoc_hash|
39
+ if (reflection = current_klass.reflect_on_association(assoc_name))
40
+ child = AssocNode.new(klass: reflection.klass, assoc_name: assoc_name, parent: node)
41
+ node.children ||= []
42
+ node.children << child
43
+ resolve_assocs(reflection.klass, child, nested_column_or_assoc_hash)
44
+ end
45
+ end
33
46
  else
34
- assoc.column_mapping[klass] ||= []
35
- assoc.column_mapping[klass] << option
36
- end
37
- end
38
- end
39
-
40
- def resolve_assocs_for_hash(klass, hash, assoc)
41
- hash.each do |assoc_name, options|
42
- if (reflection = klass.reflect_on_association(assoc_name))
43
- assoc.current[assoc_name] = {}
44
- assoc.current = assoc.current[assoc_name]
45
- resolve_assocs(reflection.klass, options, assoc)
47
+ node.columns ||= []
48
+ node.columns << column_or_assoc_hash
46
49
  end
47
50
  end
48
51
  end
@@ -75,7 +75,7 @@ module LogicalQueryParser
75
75
  operator, logic = operator_and_logic
76
76
  text = LogicalQueryParser.unquote(word.text_value)
77
77
 
78
- sql = build_arel(params, operator, text).reduce(logic).to_sql
78
+ sql = build_arel(params[:root], operator, text).reduce(logic).to_sql
79
79
  sql = "(#{sql})" if sql[0] != '(' && sql[-1] != ')'
80
80
  params[:_sql] << sql
81
81
  end
@@ -90,21 +90,12 @@ module LogicalQueryParser
90
90
  end
91
91
  end
92
92
 
93
- def build_arel(params, operator, text)
94
- if params[:columns].is_a?(Hash)
95
- build_arel_from_hash(params[:model], params[:columns], operator, text)
96
- else
97
- build_arel_from_columns(params[:model], params[:columns], operator, text)
98
- end
99
- end
100
-
101
- def build_arel_from_columns(klass, columns, operator, text)
102
- columns.map { |column| klass.arel_table[column].send(operator, Arel.sql(klass.connection.quote("%#{text}%"))) }
103
- end
104
-
105
- def build_arel_from_hash(klass, hash, operator, text)
106
- hash.flat_map do |klass, columns|
107
- build_arel_from_columns(klass, columns, operator, text)
93
+ def build_arel(root, operator, text)
94
+ assocs = [root] + root.descendants
95
+ assocs.flat_map do |assoc|
96
+ assoc.columns.map do |column|
97
+ assoc.arel_table[column].send(operator, Arel.sql(assoc.klass.connection.quote("%#{text}%")))
98
+ end
108
99
  end
109
100
  end
110
101
  end
File without changes
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LogicalQueryParser
4
- VERSION = "0.4.0"
4
+ VERSION = "0.6.0"
5
5
  end
@@ -16,13 +16,14 @@ module LogicalQueryParser
16
16
 
17
17
  def search(query, relations, *options)
18
18
  relations = relations.all if relations.respond_to?(:all)
19
- assoc = resolve_assocs(relations.klass, *options)
20
- sql = new.parse(query).to_sql(model: relations.klass, columns: assoc.column_mapping)
21
- relations.joins(assoc.structure).where(sql)
19
+ root = resolve_assocs(relations, *options)
20
+ sql = new.parse(query).to_sql(root: root)
21
+ relations = relations.left_joins(root.join_structure) unless root.join_structure.empty?
22
+ relations.where(sql)
22
23
  end
23
24
 
24
- def resolve_assocs(klass, *options)
25
- AssocResolver.new(klass).run(*options)
25
+ def resolve_assocs(relation, *options)
26
+ AssocResolver.new(relation, *options).call
26
27
  end
27
28
 
28
29
  def walk_tree(node, &block)
File without changes
@@ -19,12 +19,15 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
+ spec.required_ruby_version = ">= 3.0"
23
+
22
24
  spec.add_dependency "treetop", "~> 1.6.8"
23
25
 
26
+ spec.add_development_dependency "activerecord", ">= 7.0"
27
+ spec.add_development_dependency "sqlite3"
24
28
  spec.add_development_dependency "bundler"
29
+ spec.add_development_dependency "irb"
25
30
  spec.add_development_dependency "rake"
26
31
  spec.add_development_dependency "rspec"
27
32
  spec.add_development_dependency "simplecov"
28
- spec.add_development_dependency "activerecord"
29
- spec.add_development_dependency "sqlite3"
30
33
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logical_query_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yoshikazu Kaneta
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2024-06-23 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: treetop
@@ -25,7 +24,21 @@ dependencies:
25
24
  - !ruby/object:Gem::Version
26
25
  version: 1.6.8
27
26
  - !ruby/object:Gem::Dependency
28
- name: bundler
27
+ name: activerecord
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '7.0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '7.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: sqlite3
29
42
  requirement: !ruby/object:Gem::Requirement
30
43
  requirements:
31
44
  - - ">="
@@ -39,7 +52,7 @@ dependencies:
39
52
  - !ruby/object:Gem::Version
40
53
  version: '0'
41
54
  - !ruby/object:Gem::Dependency
42
- name: rake
55
+ name: bundler
43
56
  requirement: !ruby/object:Gem::Requirement
44
57
  requirements:
45
58
  - - ">="
@@ -53,7 +66,7 @@ dependencies:
53
66
  - !ruby/object:Gem::Version
54
67
  version: '0'
55
68
  - !ruby/object:Gem::Dependency
56
- name: rspec
69
+ name: irb
57
70
  requirement: !ruby/object:Gem::Requirement
58
71
  requirements:
59
72
  - - ">="
@@ -67,7 +80,7 @@ dependencies:
67
80
  - !ruby/object:Gem::Version
68
81
  version: '0'
69
82
  - !ruby/object:Gem::Dependency
70
- name: simplecov
83
+ name: rake
71
84
  requirement: !ruby/object:Gem::Requirement
72
85
  requirements:
73
86
  - - ">="
@@ -81,7 +94,7 @@ dependencies:
81
94
  - !ruby/object:Gem::Version
82
95
  version: '0'
83
96
  - !ruby/object:Gem::Dependency
84
- name: activerecord
97
+ name: rspec
85
98
  requirement: !ruby/object:Gem::Requirement
86
99
  requirements:
87
100
  - - ">="
@@ -95,7 +108,7 @@ dependencies:
95
108
  - !ruby/object:Gem::Version
96
109
  version: '0'
97
110
  - !ruby/object:Gem::Dependency
98
- name: sqlite3
111
+ name: simplecov
99
112
  requirement: !ruby/object:Gem::Requirement
100
113
  requirements:
101
114
  - - ">="
@@ -127,17 +140,14 @@ files:
127
140
  - Rakefile
128
141
  - bin/console
129
142
  - bin/setup
130
- - gemfiles/rails42.gemfile
131
- - gemfiles/rails50.gemfile
132
- - gemfiles/rails51.gemfile
133
- - gemfiles/rails52.gemfile
134
- - gemfiles/rails60.gemfile
135
- - gemfiles/rails61.gemfile
136
143
  - gemfiles/rails70.gemfile
137
144
  - gemfiles/rails71.gemfile
145
+ - gemfiles/rails72.gemfile
146
+ - gemfiles/rails80.gemfile
147
+ - gemfiles/rails81.gemfile
138
148
  - lib/logical_query_parser.rb
139
149
  - lib/logical_query_parser.treetop
140
- - lib/logical_query_parser/assoc.rb
150
+ - lib/logical_query_parser/assoc_node.rb
141
151
  - lib/logical_query_parser/assoc_resolver.rb
142
152
  - lib/logical_query_parser/nodes/active_record.rb
143
153
  - lib/logical_query_parser/nodes/base.rb
@@ -147,7 +157,6 @@ homepage: https://github.com/kanety/logical_query_parser
147
157
  licenses:
148
158
  - MIT
149
159
  metadata: {}
150
- post_install_message:
151
160
  rdoc_options: []
152
161
  require_paths:
153
162
  - lib
@@ -155,15 +164,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
155
164
  requirements:
156
165
  - - ">="
157
166
  - !ruby/object:Gem::Version
158
- version: '0'
167
+ version: '3.0'
159
168
  required_rubygems_version: !ruby/object:Gem::Requirement
160
169
  requirements:
161
170
  - - ">="
162
171
  - !ruby/object:Gem::Version
163
172
  version: '0'
164
173
  requirements: []
165
- rubygems_version: 3.3.3
166
- signing_key:
174
+ rubygems_version: 3.6.9
167
175
  specification_version: 4
168
176
  summary: A parser for a logical query string.
169
177
  test_files: []
@@ -1,6 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem "activerecord", "~> 4.2.9"
4
- gem "sqlite3", "~> 1.3.6"
5
-
6
- gemspec path: "../"
@@ -1,6 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem "activerecord", "~> 5.0.5"
4
- gem "sqlite3", "~> 1.3.6"
5
-
6
- gemspec path: "../"
@@ -1,6 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem "activerecord", "~> 5.1.3"
4
- gem "sqlite3", "~> 1.3.6"
5
-
6
- gemspec path: "../"
@@ -1,6 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem "activerecord", "~> 5.2.0"
4
- gem "sqlite3", "~> 1.3.6"
5
-
6
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem "activerecord", "~> 6.0.0"
4
- gem "sqlite3", "~> 1.4.0"
5
- gem "psych", "~> 3.3.0"
6
-
7
- gemspec path: "../"
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LogicalQueryParser
4
- class Assoc
5
- attr_accessor :column_mapping, :structure
6
- attr_accessor :current
7
-
8
- def initialize(attrs = {})
9
- @column_mapping = {}
10
- @structure = {}
11
- end
12
- end
13
- end