pinot 0.1.0 → 0.1.1

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: 80d2be5dfc3b959fa6e7dce9eef3cd7600f0a6ad3f5d261230a7487e1482c2af
4
- data.tar.gz: 83e396f7d954f381fe4b88326a8217e84c827793f331e229d47af0310e5cb8fe
3
+ metadata.gz: 3fa42f97735f850dc0f870866e7d6da882227a998533b3aaa94f7c6a320d20ec
4
+ data.tar.gz: '019daf46b029bdac3a7c196d0a5f2927234f63ba513873318c5e0f6d48e1d3c6'
5
5
  SHA512:
6
- metadata.gz: ae37bb8d8c521f537603e6bcbf1f82df414e55072bb11bf83511e1f0780656720635d597b1ce0ab1b699a21a685988e3e7fe90f611e10625741d231bae9794a5
7
- data.tar.gz: e0965c6c1a37d19e665a8545a01b35f346d5cd4955f08e6c3e51af4bac0b05a35e49213fc2e5192d76a3a4754e292de8029e76fec8a4e8ac289da6547b000284
6
+ metadata.gz: 03e285bd5884bae307bd58797738d478f96cf97466ec0e6992dba0de6ab5120f935fba9245c4c5f1466794cf83da4a42dcc30b6819289e736c40cc374a054639
7
+ data.tar.gz: 07345f9e2e93442855887c208d586d98a0922bc346e19cac7bc58efbea1b4a79aadafaf9abd70692957890211583b2202502fe92996278f7e87f28a503fcfd88
data/Guardfile ADDED
@@ -0,0 +1,42 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ ## Uncomment and set this to only include directories you want to watch
5
+ # directories %w(app lib config test spec features) \
6
+ # .select{|d| Dir.exist?(d) ? d : UI.warning("Directory #{d} does not exist")}
7
+
8
+ ## Note: if you are using the `directories` clause above and you are not
9
+ ## watching the project directory ('.'), then you will want to move
10
+ ## the Guardfile to a watched dir and symlink it back, e.g.
11
+ #
12
+ # $ mkdir config
13
+ # $ mv Guardfile config/
14
+ # $ ln -s config/Guardfile .
15
+ #
16
+ # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
17
+
18
+ guard :minitest do
19
+ # with Minitest::Unit
20
+ watch(%r{^test/(.*)/?test_(.*)\.rb$})
21
+ watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| "test/#{m[1]}test_#{m[2]}.rb" }
22
+ watch(%r{^test/test_helper\.rb$}) { "test" }
23
+
24
+ # with Minitest::Spec
25
+ # watch(%r{^spec/(.*)_spec\.rb$})
26
+ # watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
27
+ # watch(%r{^spec/spec_helper\.rb$}) { 'spec' }
28
+
29
+ # Rails 4
30
+ # watch(%r{^app/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
31
+ # watch(%r{^app/controllers/application_controller\.rb$}) { 'test/controllers' }
32
+ # watch(%r{^app/controllers/(.+)_controller\.rb$}) { |m| "test/integration/#{m[1]}_test.rb" }
33
+ # watch(%r{^app/views/(.+)_mailer/.+}) { |m| "test/mailers/#{m[1]}_mailer_test.rb" }
34
+ # watch(%r{^lib/(.+)\.rb$}) { |m| "test/lib/#{m[1]}_test.rb" }
35
+ # watch(%r{^test/.+_test\.rb$})
36
+ # watch(%r{^test/test_helper\.rb$}) { 'test' }
37
+
38
+ # Rails < 4
39
+ # watch(%r{^app/controllers/(.*)\.rb$}) { |m| "test/functional/#{m[1]}_test.rb" }
40
+ # watch(%r{^app/helpers/(.*)\.rb$}) { |m| "test/helpers/#{m[1]}_test.rb" }
41
+ # watch(%r{^app/models/(.*)\.rb$}) { |m| "test/unit/#{m[1]}_test.rb" }
42
+ end
@@ -0,0 +1,81 @@
1
+ module Pinot
2
+ class Client
3
+ attr_reader :host, :port, :controller_host, :controller_port, :protocol
4
+
5
+ def initialize(host:, port:, controller_port:, controller_host: nil, protocol: :http)
6
+ @host = host
7
+ @port = port
8
+ @controller_port = controller_port
9
+ @controller_host = controller_host || host
10
+ @protocol = protocol
11
+ end
12
+
13
+ def execute(sql)
14
+ Response.new(JSON.parse(http.post(query_sql_uri, json: {sql: sql})))
15
+ end
16
+
17
+ def schema(name)
18
+ url = "#{controller_uri}/schemas/#{name}"
19
+ response = http.get(url)
20
+ JSON.parse(response)
21
+ end
22
+
23
+ def delete_segments(name, type: :offline)
24
+ type = type.to_s.upcase
25
+ url = "#{controller_uri}/segments/#{name}?type=#{type}"
26
+ response = http.delete(url)
27
+ JSON.parse(response)
28
+ end
29
+
30
+ def create_table(schema)
31
+ url = "#{controller_uri}/tables"
32
+ response = http.post(url, body: schema)
33
+ JSON.parse(response)
34
+ end
35
+
36
+ def delete_table(name, type: :offline)
37
+ type = type.to_s.downcase
38
+ url = "#{controller_uri}/tables/#{name}?type=#{type}"
39
+ response = http.delete(url)
40
+ JSON.parse(response)
41
+ end
42
+
43
+ def ingest_json(file, table:)
44
+ url = "#{controller_uri}/ingestFromFile?tableNameWithType=#{table}&batchConfigMapStr=%7B%22inputFormat%22%3A%22json%22%7D"
45
+ content_type = "multipart/form-data"
46
+ response = HTTPX.post(
47
+ url,
48
+ form: {
49
+ file: {
50
+ filename: File.basename(file.path),
51
+ content_type: content_type,
52
+ body: file.read
53
+ }
54
+ }
55
+ )
56
+ JSON.parse(response)
57
+ end
58
+
59
+ def create_schema(schema, override: true, force: false)
60
+ url = "#{controller_uri}/schemas?override=#{override}&force=#{force}"
61
+ response = http.post(url, body: schema)
62
+ JSON.parse(response)
63
+ end
64
+
65
+ def http(content_type: "application/json")
66
+ HTTPX.with(headers: {"Content-Type" => content_type})
67
+ end
68
+
69
+ def uri
70
+ "#{protocol}://#{host}:#{port}"
71
+ end
72
+
73
+ def controller_uri
74
+ "#{protocol}://#{controller_host}:#{controller_port}"
75
+ end
76
+
77
+ def query_sql_uri
78
+ "#{uri}/query/sql"
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,32 @@
1
+ module Pinot
2
+ class Response
3
+ include Enumerable
4
+
5
+ def initialize(payload)
6
+ @payload = payload
7
+ end
8
+
9
+ def rows
10
+ @payload.dig("resultTable", "rows")
11
+ end
12
+
13
+ def columns
14
+ names = @payload.dig("resultTable", "dataSchema", "columnNames")
15
+ types = @payload.dig("resultTable", "dataSchema", "columnDataTypes")
16
+ return {} if @payload["exceptions"].any?
17
+ ix = 0
18
+ names ||= []
19
+ names.map do |name|
20
+ ret = [name, types[ix]]
21
+ ix += 1
22
+ ret
23
+ end.to_h
24
+ end
25
+
26
+ def each(&block)
27
+ rows.each do |row|
28
+ block.call(row)
29
+ end
30
+ end
31
+ end
32
+ end
data/lib/pinot/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pinot
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.1"
5
5
  end
data/lib/pinot.rb CHANGED
@@ -1,6 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "httpx"
4
+
3
5
  require_relative "pinot/version"
6
+ require_relative "pinot/response"
7
+ require_relative "pinot/client"
4
8
 
5
9
  module Pinot
6
10
  class Error < StandardError; end
metadata CHANGED
@@ -1,15 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pinot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Celso Fernandes
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-16 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2024-05-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httpx
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: guard
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: guard-minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest-reporters
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
13
69
  description: Client for Apache Pinot
14
70
  email:
15
71
  - celso.fernandes@clickfunnels.com
@@ -20,11 +76,13 @@ files:
20
76
  - ".standard.yml"
21
77
  - CHANGELOG.md
22
78
  - CODE_OF_CONDUCT.md
79
+ - Guardfile
23
80
  - README.md
24
81
  - Rakefile
25
82
  - lib/pinot.rb
83
+ - lib/pinot/client.rb
84
+ - lib/pinot/response.rb
26
85
  - lib/pinot/version.rb
27
- - pinot.gemspec
28
86
  - sig/pinot.rbs
29
87
  homepage: https://github.com/fernandes/pinot-ruby
30
88
  licenses: []
@@ -47,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
47
105
  - !ruby/object:Gem::Version
48
106
  version: '0'
49
107
  requirements: []
50
- rubygems_version: 3.4.21
108
+ rubygems_version: 3.5.3
51
109
  signing_key:
52
110
  specification_version: 4
53
111
  summary: Client for Apache Pinot
data/pinot.gemspec DELETED
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "lib/pinot/version"
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = "pinot"
7
- spec.version = Pinot::VERSION
8
- spec.authors = ["Celso Fernandes"]
9
- spec.email = ["celso.fernandes@clickfunnels.com"]
10
-
11
- spec.summary = "Client for Apache Pinot"
12
- spec.description = "Client for Apache Pinot"
13
- spec.homepage = "https://github.com/fernandes/pinot-ruby"
14
- spec.required_ruby_version = ">= 2.6.0"
15
-
16
- spec.metadata["homepage_uri"] = spec.homepage
17
- spec.metadata["source_code_uri"] = "https://github.com/fernandes/pinot"
18
- spec.metadata["changelog_uri"] = "https://github.com/fernandes/pinot/blob/main/CHANGELOG.md"
19
-
20
- # Specify which files should be added to the gem when it is released.
21
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
- spec.files = Dir.chdir(__dir__) do
23
- `git ls-files -z`.split("\x0").reject do |f|
24
- (File.expand_path(f) == __FILE__) ||
25
- f.start_with?(*%w[bin/ test/ spec/ features/ .git .circleci appveyor Gemfile])
26
- end
27
- end
28
- spec.bindir = "exe"
29
- spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
30
- spec.require_paths = ["lib"]
31
-
32
- # Uncomment to register a new dependency of your gem
33
- # spec.add_dependency "example-gem", "~> 1.0"
34
-
35
- # For more information and examples about making a new gem, check out our
36
- # guide at: https://bundler.io/guides/creating_gem.html
37
- end