recursifier 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9377da0704e74c9cff7c6f8b170c2f95601af14e6fc707b1a377137862bb7c12
4
+ data.tar.gz: 47da562f93257c3e83c4db12c57ae474954aaebf0f3a12c5e082859617478764
5
+ SHA512:
6
+ metadata.gz: 449d00f6335ca6c1f4c8c527eaddc7c60932e95225253dfe25e44f4d88fe150e9c92953537bf88c0789a39712571b5f6438215bac0d31ef02c1dfedaea2734cd
7
+ data.tar.gz: f508864e8bee585a63f6f96e4cd2664ccc45f231d5e453f84fb7ffd4d5b02f3aabde5ce356ff07d70f1d91e00cb7665d6ae4088c503536059eebfb95a57096f9
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Recursifier
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "recursifier/version"
4
+
5
+ module Recursifier
6
+ module RecursiveQuery
7
+
8
+ class InvalidQueryError < StandardError; end
9
+
10
+ def self.fetch_hierarchy(table_name, parent_matching_column, sub_matching_column, start_id, filters = {}, selected_columns = [], max_depth = 10, current_depth = 0)
11
+
12
+ # Validate inputs
13
+ raise InvalidQueryError, "Table name must be a string" unless table_name.is_a?(String)
14
+ raise InvalidQueryError, "Selected columns must be an array of strings" unless selected_columns.is_a?(Array) && selected_columns.all? { |col| col.is_a?(String) }
15
+
16
+ begin
17
+ # Check if the current depth exceeds the maximum depth limit
18
+ if current_depth > max_depth
19
+ return { error: "Maximum recursion depth exceeded" }
20
+ end
21
+
22
+ # Convert filters hash into SQL conditions
23
+ filter_conditions = filters.map { |key, value| "#{key} = '#{value}'" }.join(' AND ')
24
+
25
+ # Convert selected_columns array into comma-separated column names
26
+ selected_columns_str = selected_columns.empty? ? '*' : selected_columns.join(', ')
27
+
28
+ # Constructing the recursive query with additional filters and selected columns
29
+ query = <<-SQL
30
+ WITH RECURSIVE hierarchy AS (
31
+ SELECT #{selected_columns_str}, 1 AS depth FROM #{table_name} WHERE #{parent_matching_column} = #{start_id} #{filter_conditions}
32
+ UNION ALL
33
+ SELECT #{selected_columns_str}, h.depth + 1 FROM #{table_name} t
34
+ JOIN hierarchy h ON t.#{sub_matching_column} = h.#{parent_matching_column} WHERE h.depth < #{max_depth}
35
+ )
36
+ SELECT #{selected_columns_str} FROM hierarchy;
37
+ SQL
38
+
39
+ # Executing the query and return the result
40
+ ActiveRecord::Base.connection.execute(query)
41
+
42
+ rescue ActiveRecord::StatementInvalid => e
43
+ if e.message.include?("statement timeout")
44
+ # Handle statement timeout error
45
+ error_message = "Statement Timeout: #{e.message}"
46
+ else
47
+ # Handle other errors
48
+ error_message = "Error: #{e.message}"
49
+ end
50
+
51
+ # Return the error message as part of the response
52
+ { error: error_message }
53
+ end
54
+ end
55
+ end
56
+ end
metadata ADDED
@@ -0,0 +1,54 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: recursifier
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jana
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2024-03-09 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Recursifier is a Ruby gem designed to simplify and optimize recursive
14
+ querying of hierarchical data in PostgreSQL databases, particularly within Ruby
15
+ on Rails applications. It provides a convenient interface for executing recursive
16
+ queries, allowing users to fetch hierarchical data from their database tables in
17
+ a hierarchical manner.
18
+ email:
19
+ - shanmugamjanarthan24@gmail.com
20
+ executables: []
21
+ extensions: []
22
+ extra_rdoc_files: []
23
+ files:
24
+ - "./lib/recursifier.rb"
25
+ - "./lib/recursifier/version.rb"
26
+ homepage: https://github.com/janarthanan-shanmugam/recursifier
27
+ licenses:
28
+ - MIT
29
+ metadata:
30
+ allowed_push_host: https://rubygems.org
31
+ homepage_uri: https://github.com/janarthanan-shanmugam/recursifier
32
+ source_code_uri: https://github.com/janarthanan-shanmugam/recursifier
33
+ changelog_uri: https://github.com/janarthanan-shanmugam/recursifier
34
+ post_install_message:
35
+ rdoc_options: []
36
+ require_paths:
37
+ - lib
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 2.6.0
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ requirements: []
49
+ rubygems_version: 3.4.20
50
+ signing_key:
51
+ specification_version: 4
52
+ summary: This gem is used to return the recursive data from the database in optimal
53
+ way
54
+ test_files: []