pinot-client 1.24.0 → 1.25.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: b893ea9b2cefc1aca8cf86940399d36be6e071e88adc8023affb660d94ad8ce7
4
- data.tar.gz: 539a393551125f7169975b0e641f4d1b60fd0cc6390fc1c9c10b4f86c4036db0
3
+ metadata.gz: 1f76e9f295ba992d3a6c2ec7a4dc738230c8676bda0f64bafb3aa85af1530c34
4
+ data.tar.gz: 4ea8dfd7e0c530f38c860928c18c1facc76d5fabb7667cf7b802864629365dd1
5
5
  SHA512:
6
- metadata.gz: 13d9d34e4a86ac6d62b15db000f4220e28cd5498e78cfdb42b2c9edcfac5645c68332a43048d96bc16089381fc4ea9c3d0ce429a95480c481766d1ebd9dfd6ca
7
- data.tar.gz: 679bde8940819c309cbc351712cf2c4d4f3cfa1601e81ae023e5bf03a944404bd907b1f0a6fa44c2d5925909f3b8ce6533adf2a91cfea5aa284be7ab86afc9cf
6
+ metadata.gz: 2a07d7e620bf3adbbcd2f809c37854a1c96da7e1bbb416cbe994d6ce7ea5d17620839aad66b2059e5f1f0de683cd5a405868d1729b5da7dbba19ff820c1ac704
7
+ data.tar.gz: 2da45bfbb16a63ed13c72fdec7c2684511d27caac9a211155135a3697c88cbf36686a7ded2d569859cb751e8dac59a04b7d91aaf06b3d06136461a217166924e
@@ -50,6 +50,35 @@ module Pinot
50
50
  raise e
51
51
  end
52
52
 
53
+ def execute_many(queries, max_concurrency: nil)
54
+ return [] if queries.empty?
55
+
56
+ results = Array.new(queries.size)
57
+ # Queue acts as a counting semaphore: pre-filled with N tokens.
58
+ sem = max_concurrency ? build_semaphore(max_concurrency) : nil
59
+
60
+ threads = queries.each_with_index.map do |item, idx|
61
+ table = item[:table] || item["table"] || ""
62
+ query = item[:query] || item["query"] || ""
63
+ timeout_ms = item[:query_timeout_ms] || item["query_timeout_ms"]
64
+
65
+ Thread.new do
66
+ sem&.pop # acquire
67
+ begin
68
+ resp = execute_sql(table, query, query_timeout_ms: timeout_ms)
69
+ results[idx] = QueryResult.new(table: table, query: query, response: resp, error: nil)
70
+ rescue => e
71
+ results[idx] = QueryResult.new(table: table, query: query, response: nil, error: e)
72
+ ensure
73
+ sem&.push(:token) # release
74
+ end
75
+ end
76
+ end
77
+
78
+ threads.each(&:join)
79
+ results
80
+ end
81
+
53
82
  def prepare(table, query_template)
54
83
  raise ArgumentError, "table name cannot be empty" if table.nil? || table.strip.empty?
55
84
  raise ArgumentError, "query template cannot be empty" if query_template.nil? || query_template.strip.empty?
@@ -101,6 +130,12 @@ module Pinot
101
130
 
102
131
  private
103
132
 
133
+ def build_semaphore(n)
134
+ q = SizedQueue.new(n)
135
+ n.times { q.push(:token) }
136
+ q
137
+ end
138
+
104
139
  def run_with_circuit_breaker(broker, &block)
105
140
  return yield unless @circuit_breaker_registry
106
141
  @circuit_breaker_registry.for(broker).call(broker, &block)
@@ -0,0 +1,11 @@
1
+ module Pinot
2
+ QueryResult = Struct.new(:table, :query, :response, :error, keyword_init: true) do
3
+ def success?
4
+ error.nil?
5
+ end
6
+
7
+ def error?
8
+ !error.nil?
9
+ end
10
+ end
11
+ end
data/lib/pinot/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Pinot
2
- VERSION = "1.24.0"
2
+ VERSION = "1.25.0"
3
3
  end
data/lib/pinot.rb CHANGED
@@ -19,6 +19,7 @@ require_relative "pinot/controller_response"
19
19
  require_relative "pinot/controller_based_broker_selector"
20
20
  require_relative "pinot/transport"
21
21
  require_relative "pinot/circuit_breaker"
22
+ require_relative "pinot/query_result"
22
23
  require_relative "pinot/connection"
23
24
  require_relative "pinot/prepared_statement"
24
25
  require_relative "pinot/connection_factory"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pinot-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.24.0
4
+ version: 1.25.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Xiang Fu
@@ -119,6 +119,7 @@ files:
119
119
  - lib/pinot/proto/broker_service.proto
120
120
  - lib/pinot/proto/broker_service_pb.rb
121
121
  - lib/pinot/proto/broker_service_services_pb.rb
122
+ - lib/pinot/query_result.rb
122
123
  - lib/pinot/request.rb
123
124
  - lib/pinot/response.rb
124
125
  - lib/pinot/simple_broker_selector.rb