@@ -19,6 +19,8 @@ import {
1919 ChunkGeneratorParameters ,
2020 ReadRowsServiceParameters ,
2121} from './readRowsServiceParameters' ;
22+ import { google } from '../../protos/protos' ;
23+ import IRowRange = google . bigtable . v2 . IRowRange ;
2224
2325const DEBUG = process . env . BIGTABLE_TEST_DEBUG === 'true' ;
2426
@@ -163,6 +165,80 @@ function isKeyInRowSet(
163165 return true ;
164166}
165167
168+ /** Gets the property of the first row range in the request.
169+ * @param stream The stream object to get the property from.
170+ * @param property The property to get.
171+ */
172+ function getKeyProperty (
173+ request : protos . google . bigtable . v2 . IReadRowsRequest ,
174+ property : keyof IRowRange
175+ ) {
176+ if (
177+ request ?. rows ?. rowRanges &&
178+ request ?. rows ?. rowRanges [ 0 ] &&
179+ request ?. rows ?. rowRanges [ 0 ] [ property ] ?. toString ( )
180+ ) {
181+ return request ?. rows ?. rowRanges [ 0 ] [ property ] ?. toString ( ) ;
182+ }
183+ return undefined ;
184+ }
185+
186+ /** Gets the key from the request object.
187+ * @param stream The stream object to get the key from.
188+ * @param keySelectionParameters The parameters for selecting the key.
189+ * @returns {number } The selected key for generating chunks
190+ */
191+ function getSelectedKey (
192+ request : protos . google . bigtable . v2 . IReadRowsRequest ,
193+ keySelectionParameters : {
194+ keyOpenProperty : keyof IRowRange ;
195+ keyClosedProperty : keyof IRowRange ;
196+ defaultKey ?: number ;
197+ }
198+ ) {
199+ const keyRequestOpen = getKeyProperty (
200+ request ,
201+ keySelectionParameters . keyOpenProperty
202+ ) ;
203+ const keyRequestClosed = getKeyProperty (
204+ request ,
205+ keySelectionParameters . keyClosedProperty
206+ ) ;
207+ const defaultKey = keySelectionParameters . defaultKey ;
208+ return defaultKey !== undefined
209+ ? defaultKey
210+ : keyRequestClosed
211+ ? parseInt ( keyRequestClosed as string )
212+ : parseInt ( keyRequestOpen as string ) + 1 ;
213+ }
214+
215+ /** Generates chunks for rows in a fake table that match the provided RowSet.
216+ * The fake table contains monotonically increasing zero padded rows
217+ * in the range [keyFrom, keyTo).
218+ * @param request The request object to generate chunks from.
219+ * @param serviceParameters The parameters for generating chunks.
220+ * @returns {protos.google.bigtable.v2.ReadRowsResponse.ICellChunk[] } The generated chunks.
221+ */
222+ function generateChunksFromRequest (
223+ request : protos . google . bigtable . v2 . IReadRowsRequest ,
224+ serviceParameters : ReadRowsServiceParameters
225+ ) {
226+ return generateChunks ( {
227+ keyFrom : getSelectedKey ( request , {
228+ keyOpenProperty : 'startKeyOpen' ,
229+ keyClosedProperty : 'startKeyClosed' ,
230+ defaultKey : serviceParameters . defaultKeyFrom ,
231+ } ) ,
232+ keyTo : getSelectedKey ( request , {
233+ keyOpenProperty : 'endKeyOpen' ,
234+ keyClosedProperty : 'endKeyClosed' ,
235+ defaultKey : serviceParameters . defaultKeyTo ,
236+ } ) ,
237+ chunkSize : serviceParameters . chunkSize ,
238+ valueSize : serviceParameters . valueSize ,
239+ } ) ;
240+ }
241+
166242// Returns an implementation of the server streaming ReadRows call that would return
167243// monotonically increasing zero padded rows in the range [keyFrom, keyTo).
168244// The returned implementation can be passed to gRPC server.
0 commit comments