human_sql 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9465407cb06d1cdf07d92a41df2fbb43f0e6b4fa1d05f5a7023d99ca4d4cc893
4
- data.tar.gz: ca2584673baa3b67f227fcd44dd05fe0a5dc79f6025b7784377ad43da7a68ac4
3
+ metadata.gz: a61925cacbf601619d70681bbb66384d911689155fe732e23dc2f848003008e5
4
+ data.tar.gz: 9e69254fada3069ceab0c720b4f11f79ebff12047ce329058ca3c31829b9b6be
5
5
  SHA512:
6
- metadata.gz: a645a5c3a1182492ffb0c6cefe84ebf3fe9d924dea1c31a464e09a68be6f965233a8d01596ee4223a065a48f6953c6479a906589e35fc8b40e2c2b48ab6e433f
7
- data.tar.gz: d1dd7b6023d0fd76aa3f92d0f10e1a40bf1110d159c61908f7bf9b8b2707d0f6c6094dd520c4c970adf89856040a05e1a1bbbc2ef5f8b5427363ee14994d8054
6
+ metadata.gz: 62e3320021cc7aec5b26cc658cedd12aef67a9147219962f618065e067a8a4e962cfffb5354902c98644f3ea1b79e4cc42aba4ffbbfb2045db2f74eef8429ab7
7
+ data.tar.gz: daa62db81b58e300f8cb8fb073363ee7f2875ab52d45c792f07d41ef2ad484c8a207f123bea52e1989fc22ded04ac25f83584106f489e7e005aa40d01ae1eec3
Binary file
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HumanSql
4
- VERSION = "0.1.7"
4
+ VERSION = "0.1.8"
5
5
  end
data/lib/human_sql.rb CHANGED
@@ -7,10 +7,10 @@ require_relative 'human_sql/version'
7
7
  module HumanSQL
8
8
  class QueryBuilder
9
9
  OPENAI_API_URL = 'https://api.openai.com/v1/chat/completions'
10
-
10
+
11
11
  def initialize(user_input)
12
12
  @user_input = user_input
13
- @schema_content = File.read(Rails.root.join('db', 'schema.rb'))
13
+ @schema_content = summarize_schema_with_ignored_tables
14
14
  end
15
15
 
16
16
  def self.run(user_input)
@@ -43,6 +43,54 @@ module HumanSQL
43
43
 
44
44
  private
45
45
 
46
+ def summarize_schema_with_ignored_tables
47
+ schema_content = File.read(Rails.root.join('db', 'schema.rb'))
48
+ ignored_tables = HumanSQLConfig[:ignored_tables] || []
49
+
50
+ schema_summary = {}
51
+ schema_content.split("\n").each do |line|
52
+ if line.strip.start_with?("create_table")
53
+ table_name = line.match(/"([^"]+)"/)[1]
54
+ next if ignored_tables.include?(table_name)
55
+
56
+ schema_summary[table_name] = { columns: [], has_many: [], belongs_to: [] }
57
+ end
58
+
59
+ current_table = schema_summary.keys.last if schema_summary.any?
60
+
61
+ if line.strip.match?(/^t\.(\w+)\s+"([^"]+)"/) && current_table
62
+ next if ignored_tables.include?(current_table)
63
+
64
+ column_type = line.strip.match(/^t\.(\w+)\s+"([^"]+)"/)[1]
65
+ column_name = line.strip.match(/^t\.(\w+)\s+"([^"]+)"/)[2]
66
+ schema_summary[current_table][:columns] << "#{column_name}=#{column_type}"
67
+ end
68
+
69
+ if line.strip.start_with?("add_foreign_key")
70
+ match_data = line.strip.match(/"([^"]+)", "([^"]+)"(?:, column: "([^"]+)")?/)
71
+ if match_data
72
+ parent_table = match_data[1]
73
+ child_table = match_data[2]
74
+ next if ignored_tables.include?(parent_table) || ignored_tables.include?(child_table)
75
+
76
+ schema_summary[child_table] ||= { columns: [], has_many: [], belongs_to: [] }
77
+ schema_summary[parent_table] ||= { columns: [], has_many: [], belongs_to: [] }
78
+ schema_summary[child_table][:belongs_to] << parent_table
79
+ schema_summary[parent_table][:has_many] << child_table
80
+ end
81
+ end
82
+ end
83
+
84
+ schema_summary.map do |table, details|
85
+ columns = details[:columns].join(",")
86
+ has_many = details[:has_many].join(",")
87
+ belongs_to = details[:belongs_to].join(",")
88
+ %Q{#{table}={#{columns},:has_many=>[#{has_many}],:belongs_to=>[#{belongs_to}]}}
89
+ end.join("\n")
90
+ rescue StandardError => e
91
+ raise "Error processing schema: #{e.message}"
92
+ end
93
+
46
94
  def build_query_prompt(user_input, schema_content)
47
95
  prompt = <<-PROMPT
48
96
  The user has requested: "#{user_input}".
@@ -51,8 +99,10 @@ module HumanSQL
51
99
  #{schema_content}
52
100
 
53
101
  Please generate an ActiveRecord query based on this schema. The query should be in a single line of code and return the result according to the user's request.
54
- If it's necessary to access multiple related tables, prefer to use `includes` over `joins` to optimize data loading.
102
+ If it's necessary to access multiple related tables, prefer to use preload to optimize data loading.
55
103
  If the user indicates a date and time type field, only the value of the indicated date or time is saved without considering the time zone.
104
+
105
+ #{HumanSQLConfig[:additional_instructions]}
56
106
  PROMPT
57
107
  prompt
58
108
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: human_sql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nicolas Bertin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-09-09 00:00:00.000000000 Z
11
+ date: 2024-12-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -58,6 +58,7 @@ files:
58
58
  - human_sql-0.1.4.gem
59
59
  - human_sql-0.1.5.gem
60
60
  - human_sql-0.1.6.gem
61
+ - human_sql-0.1.7.gem
61
62
  - lib/human_sql.rb
62
63
  - lib/human_sql/version.rb
63
64
  - sig/human_sql.rbs
@@ -83,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
84
  - !ruby/object:Gem::Version
84
85
  version: '0'
85
86
  requirements: []
86
- rubygems_version: 3.5.18
87
+ rubygems_version: 3.5.22
87
88
  signing_key:
88
89
  specification_version: 4
89
90
  summary: A gem to convert natural language to ActiveRecord queries using OpenAI