Skip to content

Commit f4d3d30

Browse files
lumburovskalinaandhreljaKernJWittmeyer
authored
Knowledge graphs (#209)
* fix: show created by * perf: knowledge graphs * perf: knowledge graphs bo * perf: add knowledge graph bo * fix: is_integration_project * perf: update knowledge graphs * perf: knowledge graphs * perf: fetching supported file extensions * perf: add schema resolution for integrations * perf: add knowledge graphs groupings * fix: _asdict for model instances * perf: get kg by id * perf: rename knowledge graph to data block * perf: update data blocks managers * fix: data block * perf: data blocks * perf: enhance sanitized records getter * perf: data blocks updates * perf: add sql_schema to datablock * fix: data block result retreival * perf: always overwrite data block schema * perf: data block attributes * fix: auto created data block attrs * Id and usercreated as part of the request * Addion of sql_validator * fix: data block schema state * Adds sub select query validation * Enhanced test cases and validator restructure * Always true validation update * perf: disallowed identifiers * perf(ac-exec-env): data blocks run on 10 support * more check and validation * Default additionalConfig for LLM Response * perf: data block updates * perf: add limit support to validate_sql_clause * fix: data block sql_data default * perf: related attrs * fix: pr comments * Added project_id checks to the data blocks * perf(data-block): get_all endpoint * perf: dont convert keys in sqlalchemytodict * perf: pr comments * perf: save sql query to data block * perf: pr comments --------- Co-authored-by: andhreljaKern <[email protected]> Co-authored-by: JWittmeyer <[email protected]>
1 parent b5abfb2 commit f4d3d30

21 files changed

+4245
-409
lines changed

business_objects/data_block.py

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
from typing import Dict, List, Optional, Any
2+
3+
from sqlalchemy.types import Text
4+
from sqlalchemy.orm.attributes import flag_modified
5+
6+
from submodules.model.business_objects import general
7+
from submodules.model.session import session
8+
from submodules.model import DataBlock
9+
from submodules.model.enums import DataBlockType
10+
11+
12+
def get(org_id: str, project_id: str, id: str) -> DataBlock:
13+
return (
14+
session.query(DataBlock)
15+
.filter(
16+
DataBlock.organization_id == org_id,
17+
DataBlock.project_id == project_id,
18+
DataBlock.id == id,
19+
)
20+
.first()
21+
)
22+
23+
24+
def get_by_id(data_block_id: str) -> DataBlock:
25+
"""Get a data block by ID without requiring org_id."""
26+
return session.query(DataBlock).filter(DataBlock.id == data_block_id).first()
27+
28+
29+
def get_all_by_project_id(org_id: str, project_id: str) -> List[DataBlock]:
30+
return (
31+
session.query(DataBlock)
32+
.filter(
33+
DataBlock.organization_id == org_id,
34+
DataBlock.project_id == project_id,
35+
)
36+
.all()
37+
)
38+
39+
40+
def get_by_project_id_and_type(
41+
org_id: str, project_id: str, type: DataBlockType
42+
) -> DataBlock:
43+
return (
44+
session.query(DataBlock)
45+
.filter(
46+
DataBlock.organization_id == org_id,
47+
DataBlock.project_id == project_id,
48+
DataBlock.type == type.value,
49+
)
50+
.first()
51+
)
52+
53+
54+
def get_refinery_attribute_dependants(
55+
project_id: str, refinery_attribute_name: str
56+
) -> List[DataBlock]:
57+
return (
58+
session.query(DataBlock)
59+
.filter(
60+
DataBlock.project_id == project_id,
61+
DataBlock.type == DataBlockType.STABLE.value,
62+
DataBlock.sql_config.cast(Text).like(
63+
f"%data->>'{refinery_attribute_name}'%"
64+
),
65+
)
66+
.all()
67+
)
68+
69+
70+
def create(
71+
org_id: str,
72+
user_id: str,
73+
project_id: str,
74+
name: str,
75+
description: str,
76+
type: DataBlockType,
77+
with_commit: bool = True,
78+
) -> DataBlock:
79+
data_block = DataBlock(
80+
organization_id=org_id,
81+
created_by=user_id,
82+
project_id=project_id,
83+
name=name,
84+
description=description,
85+
type=type.value,
86+
)
87+
general.add(data_block, with_commit)
88+
return data_block
89+
90+
91+
def update(
92+
org_id: str,
93+
project_id: str,
94+
data_block_id: str,
95+
name: Optional[str] = None,
96+
description: Optional[str] = None,
97+
sql_config: Optional[Dict[str, Dict[str, Any]]] = None,
98+
sql_data: Optional[List[Dict[str, str]]] = None,
99+
overwrite_sql: bool = False,
100+
with_commit: bool = True,
101+
) -> DataBlock:
102+
data_block = get(org_id, project_id, data_block_id)
103+
104+
if name:
105+
data_block.name = name
106+
if description:
107+
data_block.description = description
108+
109+
if overwrite_sql:
110+
if sql_data is not None:
111+
data_block.sql_data = sql_data
112+
if sql_config is not None:
113+
data_block.sql_config = sql_config
114+
else:
115+
if sql_data is not None:
116+
if not data_block.sql_data:
117+
data_block.sql_data = []
118+
data_block.sql_data.extend(sql_data)
119+
flag_modified(data_block, "sql_data")
120+
if sql_config is not None:
121+
if not data_block.sql_config:
122+
data_block.sql_config = {}
123+
data_block.sql_config.update(sql_config)
124+
flag_modified(data_block, "sql_config")
125+
126+
general.add(data_block, with_commit)
127+
return data_block
128+
129+
130+
def delete_many(
131+
org_id: str, project_id: str, ids: List[str], with_commit: bool = False
132+
) -> None:
133+
session.query(DataBlock).filter(
134+
DataBlock.organization_id == org_id,
135+
DataBlock.project_id == project_id,
136+
DataBlock.id.in_(ids),
137+
).delete()
138+
general.flush_or_commit(with_commit)
139+
140+
141+
def execute_query(data_block: DataBlock) -> List[Dict[str, Any]]:
142+
assert (
143+
"query" in data_block.sql_config
144+
), "Data block SQL config must contain a 'query' key"
145+
return general.execute_all(data_block.sql_config["query"])

0 commit comments

Comments
 (0)