Skip to content

Commit

Permalink
Merge 6b561ce into f93ea93
Browse files Browse the repository at this point in the history
  • Loading branch information
swalrus1 authored Aug 11, 2024
2 parents f93ea93 + 6b561ce commit e2762c3
Show file tree
Hide file tree
Showing 5 changed files with 482 additions and 5 deletions.
26 changes: 21 additions & 5 deletions ydb/tests/olap/scenario/helpers/data_generators.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,30 @@ def next_row(self) -> None:
pass


class ColumnValueGeneratorNull(IColumnValueGenerator):
"""NULL column value generator.
class ColumnValueGeneratorConst(IColumnValueGenerator):
"""Const column value generator.
Allways generate NULL value."""
Allways generate specified value."""

def __init__(self, value: Any) -> None:
"""Constructor.
Args:
value: Value to generate.
Example:
DataGeneratorPerColumn(
self.schema2, 10,
ColumnValueGeneratorDefault(init_value=10))
.with_column('not_level', ColumnValueGeneratorConst(42)
)
"""

super().__init__()
self._value = value

@override
def generate_value(column: ScenarioTestHelper.Column) -> Any:
return None
def generate_value(self, column: ScenarioTestHelper.Column) -> Any:
return self._value


class ColumnValueGeneratorRandom(IColumnValueGenerator):
Expand Down
99 changes: 99 additions & 0 deletions ydb/tests/olap/scenario/helpers/table_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,69 @@ def title(self) -> str:
return f'drop column `{self._column}`'


class SetSetting(AlterTableAction):
"""Set a setting value for a table-like object.
Table-like objects are Tables and TableStore.
See {AlterTableLikeObject}.
Example:
sth = ScenarioTestHelper(ctx)
sth.execute_scheme_query(
AlterTable('testTable').action(SetSetting('TIERING', 'tiering1))
)
"""

def __init__(self, setting: str, value_literal: str) -> None:
"""Constructor.
Args:
column: Name of the column to be deleted."""

super().__init__()
self._setting = setting
self._value = value_literal

@override
def to_yql(self) -> str:
return f'SET {self._setting} {self._value}'

@override
def title(self) -> str:
return f'set {self._setting} = {self._value}'


class ResetSetting(AlterTableAction):
"""Reset value of a setting for a table-like object.
Table-like objects are Tables and TableStore.
See {AlterTableLikeObject}.
Example:
sth = ScenarioTestHelper(ctx)
sth.execute_scheme_query(
AlterTable('testTable').action(ResetSetting('TIERING'))
)
"""

def __init__(self, setting: str) -> None:
"""Constructor.
Args:
setting: Name of altered setting."""

super().__init__()
self._setting = setting

@override
def to_yql(self) -> str:
return f'RESET ({self._setting})'

@override
def title(self) -> str:
return f'reset {self._setting}'


class AlterTableLikeObject(ScenarioTestHelper.IYqlble):
"""The base class for all requests to change table-like objects.
Expand Down Expand Up @@ -277,6 +340,42 @@ def drop_column(self, column: str) -> AlterTableLikeObject:

return self(DropColumn(column))

def set_tiering(self, tiering_rule: str) -> AlterTableLikeObject:
"""Set a tiering policy.
The method is similar to calling {AlterTableLikeObject.action} with a {SetSetting} instance.
Args:
tiering_rule: Name of a TIERING_RULE object.
Returns:
self."""

return self(SetSetting('TIERING', f'"{tiering_rule}"'))

def reset_tiering(self) -> AlterTableLikeObject:
"""Remove a tiering policy.
The method is similar to calling {AlterTableLikeObject.action} with a {SetSetting} instance.
Returns:
self."""

return self(ResetSetting('TIERING'))

def set_ttl(self, interval: str, column: str) -> AlterTableLikeObject:
"""Set TTL for rows.
The method is similar to calling {AlterTableLikeObject.action} with a {SetSetting} instance.
Args:
tiering_rule: Name of a TIERING_RULE object.
Returns:
self."""

return self(SetSetting('TTL', f'Interval("{interval}") ON `{column}`'))

@override
def params(self) -> Dict[str, str]:
return {self._type(): self._name, 'actions': ', '.join([a.title() for a in self._actions])}
Expand Down
214 changes: 214 additions & 0 deletions ydb/tests/olap/scenario/helpers/tiering_helper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
from __future__ import annotations
from ydb.tests.olap.scenario.helpers.scenario_tests_helper import (
ScenarioTestHelper,
TestContext,
)
from abc import abstractmethod

from typing import override, Dict
from dataclasses import dataclass
import json


@dataclass
class ObjectStorageParams:
endpoint: str
bucket: str
access_key: str
secret_key: str
scheme: str = 'HTTP'
verify_ssl: bool = False

def to_proto_str(self) -> str:
return (
f'Scheme: {self.scheme}\n'
f'VerifySSL: {str(self.verify_ssl).lower()}\n'
f'Endpoint: "{self.endpoint}"\n'
f'Bucket: "{self.bucket}"\n'
f'AccessKey: "{self.access_key}"\n'
f'SecretKey: "{self.secret_key}"\n'
)


@dataclass
class TieringRule:
tier_name: str
duration_for_evict: str

def to_dict(self):
return {
'tierName': self.tier_name,
'durationForEvict': self.duration_for_evict,
}


@dataclass
class TieringPolicy:
rules: list[TieringRule]

def __init__(self):
self.rules = []

def with_rule(self, rule: TieringRule):
self.rules.append(rule)
return self

def to_json(self) -> str:
return json.dumps({'rules': list(map(lambda x: x.to_dict(), self.rules))})


@dataclass
class TierConfig:
name: str
s3_params: ObjectStorageParams

def to_proto_str(self) -> str:
return (
f'Name: "{self.name}"\n'
f'ObjectStorage: {{\n{self.s3_params.to_proto_str()}\n}}'
)


class AlterTieringRule(ScenarioTestHelper.IYqlble):
"""Alter a tiering rule.
See {ScenarioTestHelper.IYqlble}.
"""

def __init__(self, name: str, default_column: str, config: TieringPolicy) -> None:
"""Constructor.
Args:
name: Name (relative path) of the altered object.
default_column: Default column used for tiering.
config: Tiering rules to apply."""

super().__init__(name)
self._default_column: str = default_column
self._config: TieringPolicy = config

@override
def params(self) -> Dict[str, str]:
return {'tiering_rule': self._name, 'config': self._config.to_json()}

@override
def title(self):
return 'Alter tiering rule'

@override
def to_yql(self, ctx: TestContext) -> str:
return f'ALTER OBJECT `{self._name}` (TYPE TIERING_RULE)' \
f' SET (defaultColumn = {self._default_column}, description = `{self._config.to_json()}`)'


class CreateTieringRule(AlterTieringRule):
"""Create a tiering rule.
See {ScenarioTestHelper.IYqlble}.
"""

@override
def title(self):
return 'Create tiering rule'

@override
def to_yql(self, ctx: TestContext) -> str:
return f'CREATE OBJECT `{self._name}` (TYPE TIERING_RULE)' \
f' WITH (defaultColumn = {self._default_column}, description = `{self._config.to_json()}`)'


class AlterTier(ScenarioTestHelper.IYqlble):
"""Alter a tier.
See {ScenarioTestHelper.IYqlble}.
"""

def __init__(self, name: str, config: TierConfig) -> None:
"""Constructor.
Args:
name: Name (relative path) of the altered object.
config: Tier configuration."""

super().__init__(name)
self._config: TierConfig = config

@override
def params(self) -> Dict[str, str]:
return {'tier': self._name, 'config': self._config.to_proto_str()}

@override
def title(self):
return 'Alter tier'

@override
def to_yql(self, ctx: TestContext) -> str:
return f'ALTER OBJECT `{self._name}` (TYPE TIER) SET (tierConfig = `{self._config.to_proto_str()}`)'


class CreateTier(AlterTier):
"""Create a tier.
See {ScenarioTestHelper.IYqlble}.
"""

@override
def title(self):
return 'Create tier'

@override
def to_yql(self, ctx: TestContext) -> str:
return f'CREATE OBJECT `{self._name}` (TYPE TIER) WITH (tierConfig = `{self._config.to_proto_str()}`)'


class DropObjectBase(ScenarioTestHelper.IYqlble):
"""Drop a tier.
See {ScenarioTestHelper.IYqlble}.
"""

def __init__(self, name: str) -> None:
"""Constructor.
Args:
name: Name (relative path) of the altered object."""

super().__init__(name)

@override
def params(self) -> Dict[str, str]:
return {'object_type': self._object_type()}

@override
def title(self):
return f'Drop {self._object_type().lower()}'

@override
def to_yql(self, ctx: TestContext) -> str:
return f'DROP OBJECT `{self._name}` (TYPE {self._object_type()})'

@abstractmethod
def _object_type(self) -> str:
pass


class DropTier(DropObjectBase):
"""Drop a tier.
See {ScenarioTestHelper.IYqlble}.
"""

@override
def _object_type(self):
return 'TIER'


class DropTieringRule(DropObjectBase):
"""Drop a tier.
See {ScenarioTestHelper.IYqlble}.
"""

@override
def _object_type(self):
return 'TIERING_RULE'
Loading

0 comments on commit e2762c3

Please sign in to comment.