@@ -79,9 +79,11 @@ func (c *MySqlConnector) GetQRepPartitions(
79
79
}
80
80
81
81
// Query to get the total number of rows in the table
82
- countQuery := fmt .Sprintf ("SELECT COUNT(*) FROM %s %s" , parsedWatermarkTable .MySQL (), whereClause )
82
+ countQuery := fmt .Sprintf ("SELECT COUNT(*),MIN(%[2]s),MAX(%[2]s) FROM %[1]s %[3]s" ,
83
+ parsedWatermarkTable .MySQL (), config .WatermarkColumn , whereClause )
83
84
var minVal any
84
85
var totalRows int64
86
+ var rs * mysql.Result
85
87
if last != nil && last .Range != nil {
86
88
switch lastRange := last .Range .Range .(type ) {
87
89
case * protos.PartitionRange_IntRange :
@@ -91,27 +93,20 @@ func (c *MySqlConnector) GetQRepPartitions(
91
93
case * protos.PartitionRange_TimestampRange :
92
94
minVal = lastRange .TimestampRange .End .AsTime ().String ()
93
95
}
94
- c .logger .Info (fmt .Sprintf ("count query: %s - minVal: %v" , countQuery , minVal ))
95
-
96
- rs , err := c .Execute (ctx , countQuery , minVal )
97
- if err != nil {
98
- return nil , err
99
- }
96
+ c .logger .Info ("querying count" , slog .String ("query" , countQuery ), slog .Any ("minVal" , minVal ))
100
97
101
- totalRows , err = rs .GetInt (0 , 0 )
102
- if err != nil {
103
- return nil , fmt .Errorf ("failed to query for total rows: %w" , err )
104
- }
98
+ rs , err = c .Execute (ctx , countQuery , minVal )
105
99
} else {
106
- rs , err := c .Execute (ctx , countQuery )
107
- if err != nil {
108
- return nil , err
109
- }
100
+ rs , err = c .Execute (ctx , countQuery )
101
+ }
102
+ if err != nil {
103
+ return nil , err
104
+ }
105
+ defer rs .Close ()
110
106
111
- totalRows , err = rs .GetInt (0 , 0 )
112
- if err != nil {
113
- return nil , fmt .Errorf ("failed to query for total rows: %w" , err )
114
- }
107
+ totalRows , err = rs .GetInt (0 , 0 )
108
+ if err != nil {
109
+ return nil , fmt .Errorf ("failed to query for total rows: %w" , err )
115
110
}
116
111
117
112
if totalRows == 0 {
@@ -125,120 +120,26 @@ func (c *MySqlConnector) GetQRepPartitions(
125
120
numPartitions ++
126
121
}
127
122
128
- watermarkQKind , watermarkMyType , err := c .GetDataTypeOfWatermarkColumn (ctx , parsedWatermarkTable .MySQL (), config .WatermarkColumn )
123
+ watermarkMyType := rs .Fields [1 ].Type
124
+ watermarkQKind , err := qkindFromMysql (rs .Fields [1 ])
129
125
if err != nil {
130
- return nil , fmt .Errorf ("failed to get data type of watermark column %s : %w" , config . WatermarkColumn , err )
126
+ return nil , fmt .Errorf ("failed to convert mysql type to qvaluekind : %w" , err )
131
127
}
132
128
133
- c .logger .Info (fmt .Sprintf ("total rows: %d, num partitions: %d, num rows per partition: %d" ,
134
- totalRows , numPartitions , numRowsPerPartition ))
135
- var rs * mysql.Result
136
-
137
- switch watermarkQKind {
138
- case types .QValueKindInt8 , types .QValueKindInt16 , types .QValueKindInt32 , types .QValueKindInt64 ,
139
- types .QValueKindUInt8 , types .QValueKindUInt16 , types .QValueKindUInt32 , types .QValueKindUInt64 :
140
- if minVal != nil {
141
- partitionsQuery := fmt .Sprintf (
142
- `WITH stats AS (
143
- SELECT MIN(%[2]s) AS min_watermark,
144
- 1.0 * (MAX(%[2]s) - MIN(%[2]s)) / (%[1]d) AS range_size
145
- FROM %[3]s WHERE %[2]s > ?
146
- )
147
- SELECT FLOOR((w.%[2]s - s.min_watermark) / s.range_size) AS bucket,
148
- MIN(w.%[2]s) AS start, MAX(w.%[2]s) AS end
149
- FROM %[3]s AS w
150
- CROSS JOIN stats AS s
151
- WHERE w.%[2]s > ?
152
- GROUP BY bucket
153
- ORDER BY start;` ,
154
- numPartitions ,
155
- quotedWatermarkColumn ,
156
- parsedWatermarkTable .MySQL (),
157
- )
158
- c .logger .Info ("partitions query" , slog .String ("query" , partitionsQuery ), slog .Any ("minVal" , minVal ))
159
- rs , err = c .Execute (ctx , partitionsQuery , minVal , minVal )
160
- } else {
161
- partitionsQuery := fmt .Sprintf (
162
- `WITH stats AS (
163
- SELECT MIN(%[2]s) AS min_watermark,
164
- 1.0 * (MAX(%[2]s) - MIN(%[2]s)) / (%[1]d) AS range_size
165
- FROM %[3]s
166
- )
167
- SELECT FLOOR((w.%[2]s - s.min_watermark) / s.range_size) AS bucket,
168
- MIN(w.%[2]s) AS start, MAX(w.%[2]s) AS end
169
- FROM %[3]s AS w
170
- CROSS JOIN stats AS s
171
- GROUP BY bucket
172
- ORDER BY start;` ,
173
- numPartitions ,
174
- quotedWatermarkColumn ,
175
- parsedWatermarkTable .MySQL (),
176
- )
177
- c .logger .Info ("partitions query" , slog .String ("query" , partitionsQuery ))
178
- rs , err = c .Execute (ctx , partitionsQuery )
179
- }
180
- if err != nil {
181
- return nil , fmt .Errorf ("failed to query for partitions: %w" , err )
182
- }
183
- case types .QValueKindTimestamp , types .QValueKindTimestampTZ :
184
- if minVal != nil {
185
- partitionsQuery := fmt .Sprintf (
186
- `WITH stats AS (
187
- SELECT MIN(%[2]s) AS min_watermark,
188
- 1.0 * (TIMESTAMPDIFF(MICROSECOND, MAX(%[2]s), MIN(%[2]s)) / (%[1]d)) AS range_size
189
- FROM %[3]s WHERE %[2]s > ?
190
- )
191
- SELECT FLOOR(TIMESTAMPDIFF(MICROSECOND, w.%[2]s, s.min_watermark) / s.range_size) AS bucket,
192
- MIN(w.%[2]s) AS start, MAX(w.%[2]s) AS end
193
- FROM %[3]s AS w
194
- CROSS JOIN stats AS s
195
- WHERE w.%[2]s > ?
196
- GROUP BY bucket
197
- ORDER BY start;` ,
198
- numPartitions ,
199
- quotedWatermarkColumn ,
200
- parsedWatermarkTable .MySQL (),
201
- )
202
- c .logger .Info ("partitions query" , slog .String ("query" , partitionsQuery ), slog .Any ("minVal" , minVal ))
203
- rs , err = c .Execute (ctx , partitionsQuery , minVal )
204
- } else {
205
- partitionsQuery := fmt .Sprintf (
206
- `WITH stats AS (
207
- SELECT MIN(%[2]s) AS min_watermark,
208
- 1.0 * (TIMESTAMPDIFF(MICROSECOND, MAX(%[2]s), MIN(%[2]s)) / (%[1]d)) AS range_size
209
- FROM %[3]s
210
- )
211
- SELECT FLOOR(TIMESTAMPDIFF(MICROSECOND, w.%[2]s, s.min_watermark) / s.range_size) AS bucket,
212
- MIN(w.%[2]s) AS start, MAX(w.%[2]s) AS end
213
- FROM %[3]s AS w
214
- CROSS JOIN stats AS s
215
- GROUP BY bucket
216
- ORDER BY start;` ,
217
- numPartitions ,
218
- quotedWatermarkColumn ,
219
- parsedWatermarkTable .MySQL (),
220
- )
221
- c .logger .Info ("partitions query" , slog .String ("query" , partitionsQuery ))
222
- rs , err = c .Execute (ctx , partitionsQuery )
223
- }
224
- if err != nil {
225
- return nil , fmt .Errorf ("failed to query for partitions: %w" , err )
226
- }
227
- }
129
+ c .logger .Info ("queried info for partitioning" ,
130
+ slog .Int64 ("totalRows" , totalRows ), slog .Int64 ("numPartitions" , numPartitions ), slog .Int64 ("rowsPerPartition" , numRowsPerPartition ))
228
131
229
132
partitionHelper := utils .NewPartitionHelper (c .logger )
230
- for _ , row := range rs .Values {
231
- val1 , err := QValueFromMysqlFieldValue (watermarkQKind , watermarkMyType , row [1 ])
232
- if err != nil {
233
- return nil , err
234
- }
235
- val2 , err := QValueFromMysqlFieldValue (watermarkQKind , watermarkMyType , row [2 ])
236
- if err != nil {
237
- return nil , err
238
- }
239
- if err := partitionHelper .AddPartition (val1 .Value (), val2 .Value ()); err != nil {
240
- return nil , fmt .Errorf ("failed to add partition: %w" , err )
241
- }
133
+ val1 , err := QValueFromMysqlFieldValue (watermarkQKind , watermarkMyType , rs .Values [0 ][1 ])
134
+ if err != nil {
135
+ return nil , fmt .Errorf ("failed to convert partition minimum to qvalue: %w" , err )
136
+ }
137
+ val2 , err := QValueFromMysqlFieldValue (watermarkQKind , watermarkMyType , rs .Values [0 ][2 ])
138
+ if err != nil {
139
+ return nil , fmt .Errorf ("fialed to convert partition maximum to qvalue: %w" , err )
140
+ }
141
+ if err := partitionHelper .AddPartitionsWithRange (val1 .Value (), val2 .Value (), numPartitions ); err != nil {
142
+ return nil , fmt .Errorf ("failed to add partitions: %w" , err )
242
143
}
243
144
244
145
return partitionHelper .GetPartitions (), nil
0 commit comments