5from dataclasses
import dataclass, field, KW_ONLY, fields
6from typing
import Dict, Any, List, Optional, Tuple, Union
15 def __call__(self, db):
18 config = {k: v.file
if isinstance(v, RemoteResource)
else v
21 return getattr(SQLamarr, self.
get_imp())(db, **config)
22 except (TypeError, AttributeError)
as e:
23 logging.getLogger(
"Wrapper").error(
24 f
"Error while configuring {self.__class__.__name__} "
25 f
"as {self.get_imp()}"
30 if hasattr(self,
"implements"):
31 return getattr(self,
"implements")
32 raise AttributeError(
"Class derived from Wrapper does not implement `implements` property")
35 if not hasattr(self,
"config"):
36 raise AttributeError(
"Class derived from Wrapper does not implement `config` property")
38 if 'query' in self.config.keys()
and len(self.config[
'query']) > 16384:
39 raise ValueError(
"Length of the query [{self.__class__.__name__}] exceeds maximum length of 16384 bytes")
41 return getattr(self,
"config")
45 def to_xml(self, parent_node):
49 name=self.__class__.__name__
52 for k, v
in self.config.items():
55 if isinstance(v, RemoteResource):
56 e3.SubElement(node,
"CONFIG", key=k, type=
'url').text = v.remote_url
57 elif isinstance(v, (list, tuple, set)):
58 e3.SubElement(node,
"CONFIG", key=k, type=
'seq').text =
";".join(v)
60 e3.SubElement(node,
"CONFIG", key=k, type=
'str').text = str(v)
66@dataclass(frozen=True)
76 output_columns: List[str],
77 make_persistent: Optional[bool] =
True
82 def __call__(self, query_func):
85 @dataclass(frozen=True)
87 output_table: Optional[str] = query_func.__name__
94 implements: str =
"TemporaryTable"
99 output_table=s.output_table,
100 outputs=s.output_columns,
102 make_persistent=s.make_persistent,