Skip to content

Commit 47d17c0

Browse files
committed
key_range for ReadTable implemented
1 parent ba1df75 commit 47d17c0

File tree

4 files changed

+213
-0
lines changed

4 files changed

+213
-0
lines changed

src/Session.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,14 @@ public function readTable($path, $columns = [], $options = [])
457457
$params['ordered'] = (bool)$options['ordered'];
458458
}
459459

460+
if (isset($options['key_range']))
461+
{
462+
if ($key_range = $this->convertKeyRange($options['key_range']))
463+
{
464+
$params['key_range'] = $key_range;
465+
}
466+
}
467+
460468
return $this->streamRequest('StreamReadTable', $params);
461469
}
462470

src/Traits/TypeHelpersTrait.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use YandexCloud\Ydb\Types\Utf8Type;
1818
use YandexCloud\Ydb\Types\Int64Type;
1919
use YandexCloud\Ydb\Types\FloatType;
20+
use YandexCloud\Ydb\Types\TupleType;
2021
use YandexCloud\Ydb\Types\DoubleType;
2122
use YandexCloud\Ydb\Types\Uint64Type;
2223
use YandexCloud\Ydb\Types\StringType;
@@ -440,4 +441,15 @@ public function struct($types, $value = null)
440441
->itemTypes($types);
441442
}
442443

444+
/**
445+
* @param mixed $types
446+
* @param array $value
447+
* @return TypeContract
448+
*/
449+
public function tuple($types, $value = [])
450+
{
451+
return (new TupleType($value))
452+
->itemTypes($types);
453+
}
454+
443455
}

src/Traits/TypeValueHelpersTrait.php

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Ydb\TypedValue;
1212
use Ydb\StructType as YdbStructType;
1313
use Ydb\StructMember;
14+
use Ydb\Table\KeyRange;
1415
use Ydb\Type\PrimitiveTypeId;
1516

1617
use Google\Protobuf\NullValue;
@@ -24,6 +25,7 @@
2425
use YandexCloud\Ydb\Types\Utf8Type;
2526
use YandexCloud\Ydb\Types\Int64Type;
2627
use YandexCloud\Ydb\Types\FloatType;
28+
use YandexCloud\Ydb\Types\TupleType;
2729
use YandexCloud\Ydb\Types\DoubleType;
2830
use YandexCloud\Ydb\Types\Uint64Type;
2931
use YandexCloud\Ydb\Types\StringType;
@@ -150,6 +152,11 @@ public function valueOfType($value, $type)
150152
return (new StructType($value))->itemTypes(trim(substr($type, 7, -1)));
151153
}
152154

155+
else if (substr($_type, 0, 5) === 'TUPLE')
156+
{
157+
return (new TupleType($value))->itemTypes(trim(substr($type, 6, -1)));
158+
}
159+
153160
throw new Exception('YDB: Unknown [' . $type . '] type.');
154161
}
155162

@@ -293,4 +300,60 @@ protected function convertType($type)
293300
return $type;
294301
}
295302

303+
protected function convertKeyRange(array $ranges = [])
304+
{
305+
if (!is_a($ranges, KeyRange::class))
306+
{
307+
$key_range = [];
308+
foreach ($ranges as $key => $value)
309+
{
310+
if (!is_a($value, TypedValue::class))
311+
{
312+
if (!is_a($value, TupleType::class))
313+
{
314+
throw new Exception('YDB: KeyRange must be instance of [' . TupleType::class . ']');
315+
}
316+
else if (is_a($value, TypeContract::class))
317+
{
318+
$value = $value->toTypedValue();
319+
}
320+
else
321+
{
322+
$value = $this->typeValue($value)->toTypedValue();
323+
}
324+
}
325+
switch ($key)
326+
{
327+
case '>':
328+
case 'gt':
329+
case 'greater':
330+
$key_range['greater'] = $value;
331+
break;
332+
333+
case '>=':
334+
case 'gte':
335+
case 'greater_or_equal':
336+
$key_range['greater_or_equal'] = $value;
337+
break;
338+
339+
case '<':
340+
case 'lt':
341+
case 'less':
342+
$key_range['less'] = $value;
343+
break;
344+
345+
case '<=':
346+
case 'lte':
347+
case 'less_or_equal':
348+
$key_range['less_or_equal'] = $value;
349+
break;
350+
}
351+
}
352+
if ($key_range)
353+
{
354+
return new KeyRange($key_range);
355+
}
356+
}
357+
return $ranges;
358+
}
296359
}

src/Types/TupleType.php

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
<?php
2+
3+
namespace YandexCloud\Ydb\Types;
4+
5+
use Ydb\Type;
6+
use Ydb\Value;
7+
use Ydb\TupleType as YdbTupleType;
8+
use Ydb\OptionalType;
9+
use YandexCloud\Ydb\Contracts\TypeContract;
10+
11+
class TupleType extends AbstractType
12+
{
13+
/**
14+
* @var array
15+
*/
16+
protected $itemTypes = [];
17+
18+
/**
19+
* @param string|array $types
20+
* @return $this
21+
*/
22+
public function itemTypes($types)
23+
{
24+
if (is_array($types))
25+
{
26+
$this->itemTypes = $types;
27+
}
28+
else
29+
{
30+
$this->itemTypes = [];
31+
$types = array_map('trim', explode(',', $types));
32+
foreach ($types as $type)
33+
{
34+
$this->itemTypes[] = $type;
35+
}
36+
}
37+
return $this;
38+
}
39+
40+
/**
41+
* @inherit
42+
*/
43+
public function toYdbValue()
44+
{
45+
if ($this->value === null)
46+
{
47+
return new Value(['items' => []]);
48+
}
49+
50+
return new Value([
51+
'items' => $this->convertValue(),
52+
]);
53+
}
54+
55+
/**
56+
* @inherit
57+
*/
58+
public function getYdbType()
59+
{
60+
return new Type([
61+
'tuple_type' => new YdbTupleType([
62+
'elements' => $this->convertToElements(),
63+
]),
64+
]);
65+
}
66+
67+
/**
68+
* @inherit
69+
*/
70+
public function toYdbType()
71+
{
72+
return $this->getYdbType();
73+
}
74+
75+
/**
76+
* @inherit
77+
*/
78+
protected function getYqlString()
79+
{
80+
$value = implode(', ', array_map(function($item) {
81+
return $item->toYqlString();
82+
}, $this->convertValue()));
83+
84+
return '(' . $value . ')';
85+
}
86+
87+
88+
protected function convertToElements()
89+
{
90+
$elements = [];
91+
92+
foreach ($this->itemTypes as $type)
93+
{
94+
$elements[] = new Type([
95+
'type_id' => $this->convertType($type),
96+
'optional_type' => new OptionalType([
97+
'item' => new Type([
98+
'type_id' => $this->convertType($type),
99+
]),
100+
]),
101+
]);
102+
}
103+
104+
return $elements;
105+
}
106+
107+
protected function convertValue()
108+
{
109+
if ($this->value)
110+
{
111+
$items = (array)$this->value;
112+
113+
$data = [];
114+
115+
foreach ($this->itemTypes as $i => $type)
116+
{
117+
if (isset($items[$i]))
118+
{
119+
$data[] = $this->typeValue($items[$i], $type)->toYdbValue();
120+
}
121+
}
122+
123+
return $data;
124+
}
125+
else
126+
{
127+
return $this->value;
128+
}
129+
}
130+
}

0 commit comments

Comments
 (0)