Queries
Definition for main collection for queries.
Queries
¶
Collection and executor for queries.
Source code in edgeql_queries/queries.py
class Queries:
"""Collection and executor for queries."""
def __init__(self, is_async: bool = True) -> None:
"""Initialize collection and executor for queries.
Arguments:
is_async: use async driver for creating queries.
"""
self._query_handlers: Dict[str, QueryHandler] = {}
self._available_queries: Set[Query] = set()
self._available_queries_groups: Dict[str, Queries] = {}
self._is_async = is_async
self._json = False
@property
def available_queries(self) -> List[Query]:
"""Sorted list of queries available on this collection.
Returns:
List of queries.
"""
return sorted(self._available_queries, key=lambda query: query.name)
@property
def is_async(self) -> bool:
"""Will be query handlers generated for async execution.
Returns:
Will be query handlers generated for async execution.
"""
return self._is_async
@property
def json(self) -> "Queries":
"""Return copy of queries that will use JSON as output format.
Returns:
Copied queries.
"""
handlers = {}
for name, query_handler in self._query_handlers.items():
if isinstance(query_handler, Queries):
query_handler = query_handler.json
else:
query_handler = query_handler.as_json()
handlers[name] = query_handler
queries = self.__class__()
queries._query_handlers = handlers
queries._json = True
queries._available_queries = self._available_queries
queries._available_queries_groups = self._available_queries_groups
queries._is_async = self._is_async
return queries
def add_query(self, name: str, query_handler: Union[Queries, Query]) -> None:
"""Add a single query to collection.
Arguments:
name: name of query or sub-queries to be added.
query_handler: a single [query][edgeql_queries.models.Query] that
will be transformed to executor or
[collection of queries][edgeql_queries.queries.Queries]
that will be registered as sub-queries.
"""
handler_for_query: Union[Callable, Queries]
if isinstance(query_handler, Query):
self._available_queries.add(query_handler)
if self._is_async:
handler_for_query = AsyncExecutor(query_handler)
else:
handler_for_query = SyncExecutor(query_handler)
else:
handler_for_query = query_handler
self._available_queries_groups[name] = handler_for_query
self._query_handlers[name] = handler_for_query
def get_executor(self, query_name: str) -> Union[Callable, "Queries"]:
"""Return executor for query by name.
Arguments:
query_name: name of query for which executor should be returned.
Returns:
Executor for query.
"""
return self._query_handlers[query_name]
def __getattr__(self, query_name: str) -> Union[Callable, "Queries"]:
"""Get executor for query by name.
Arguments:
query_name: name of query or group.
Returns:
Executor for query.
"""
return self.get_executor(query_name)
def __repr__(self) -> str:
"""Return special string representation of collection.
Returns:
Raw string for queries collection.
"""
return "Queries(queries: {0}, groups: {1})".format(
self.available_queries,
self._available_queries_groups,
)
available_queries: List[Query]
property
readonly
¶
Sorted list of queries available on this collection.
Returns:
Type | Description |
---|---|
List[Query] |
List of queries. |
is_async: bool
property
readonly
¶
Will be query handlers generated for async execution.
Returns:
Type | Description |
---|---|
bool |
Will be query handlers generated for async execution. |
json: 'Queries'
property
readonly
¶
Return copy of queries that will use JSON as output format.
Returns:
Type | Description |
---|---|
'Queries' |
Copied queries. |
__getattr__(self, query_name)
special
¶
Get executor for query by name.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
query_name |
str |
name of query or group. |
required |
Returns:
Type | Description |
---|---|
Union[Callable, 'Queries'] |
Executor for query. |
Source code in edgeql_queries/queries.py
def __getattr__(self, query_name: str) -> Union[Callable, "Queries"]:
"""Get executor for query by name.
Arguments:
query_name: name of query or group.
Returns:
Executor for query.
"""
return self.get_executor(query_name)
__init__(self, is_async=True)
special
¶
Initialize collection and executor for queries.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
is_async |
bool |
use async driver for creating queries. |
True |
Source code in edgeql_queries/queries.py
def __init__(self, is_async: bool = True) -> None:
"""Initialize collection and executor for queries.
Arguments:
is_async: use async driver for creating queries.
"""
self._query_handlers: Dict[str, QueryHandler] = {}
self._available_queries: Set[Query] = set()
self._available_queries_groups: Dict[str, Queries] = {}
self._is_async = is_async
self._json = False
__repr__(self)
special
¶
Return special string representation of collection.
Returns:
Type | Description |
---|---|
str |
Raw string for queries collection. |
Source code in edgeql_queries/queries.py
def __repr__(self) -> str:
"""Return special string representation of collection.
Returns:
Raw string for queries collection.
"""
return "Queries(queries: {0}, groups: {1})".format(
self.available_queries,
self._available_queries_groups,
)
add_query(self, name, query_handler)
¶
Add a single query to collection.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
name |
str |
name of query or sub-queries to be added. |
required |
query_handler |
Union[Queries, Query] |
a single query that will be transformed to executor or collection of queries that will be registered as sub-queries. |
required |
Source code in edgeql_queries/queries.py
def add_query(self, name: str, query_handler: Union[Queries, Query]) -> None:
"""Add a single query to collection.
Arguments:
name: name of query or sub-queries to be added.
query_handler: a single [query][edgeql_queries.models.Query] that
will be transformed to executor or
[collection of queries][edgeql_queries.queries.Queries]
that will be registered as sub-queries.
"""
handler_for_query: Union[Callable, Queries]
if isinstance(query_handler, Query):
self._available_queries.add(query_handler)
if self._is_async:
handler_for_query = AsyncExecutor(query_handler)
else:
handler_for_query = SyncExecutor(query_handler)
else:
handler_for_query = query_handler
self._available_queries_groups[name] = handler_for_query
self._query_handlers[name] = handler_for_query
get_executor(self, query_name)
¶
Return executor for query by name.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
query_name |
str |
name of query for which executor should be returned. |
required |
Returns:
Type | Description |
---|---|
Union[Callable, 'Queries'] |
Executor for query. |
Source code in edgeql_queries/queries.py
def get_executor(self, query_name: str) -> Union[Callable, "Queries"]:
"""Return executor for query by name.
Arguments:
query_name: name of query for which executor should be returned.
Returns:
Executor for query.
"""
return self._query_handlers[query_name]
load_from_list(queries_collection, queries)
¶
Add queries from list.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
queries_collection |
Queries |
already registered queries. |
required |
queries |
List[Query] |
list of queries to be added. |
required |
Returns:
Type | Description |
---|---|
Queries |
Collection of queries to which method was applied. |
Source code in edgeql_queries/queries.py
def load_from_list(queries_collection: Queries, queries: List[Query]) -> Queries:
"""Add queries from list.
Arguments:
queries_collection: already registered queries.
queries: list of queries to be added.
Returns:
Collection of queries to which method was applied.
"""
for query in queries:
queries_collection.add_query(query.name, query)
return queries_collection
load_from_tree(queries_collection, query_tree)
¶
Add queries from tree.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
queries_collection |
Queries |
already registered queries. |
required |
query_tree |
QueriesTree |
tree of queries that should be added. |
required |
Returns:
Type | Description |
---|---|
Queries |
Collection of queries to which method was applied. |
Source code in edgeql_queries/queries.py
def load_from_tree(queries_collection: Queries, query_tree: QueriesTree) -> Queries:
"""Add queries from tree.
Arguments:
queries_collection: already registered queries.
query_tree: tree of queries that should be added.
Returns:
Collection of queries to which method was applied.
"""
for group_name, queries in query_tree.items():
if isinstance(queries, dict):
queries_collection.add_query(
group_name,
load_from_tree(Queries(queries_collection.is_async), queries),
)
else:
queries_collection.add_query(queries.name, queries)
return queries_collection