Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: New simple query for handling Plexos objects #18

Merged
merged 5 commits into from
Oct 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "hatchling.build"

[project]
name = "plexosdb"
version = "0.0.4"
version = "0.0.5"
readme = "README.md"
license = {file = "LICENSE.txt"}
keywords = []
Expand Down
95 changes: 95 additions & 0 deletions src/plexosdb/queries/simple_object_query.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
-- Query to get all the objects and nested objects
-- We do not include scenario tags on nested objects.
WITH scenario_cte AS (
SELECT
object.name,
object.object_id,
tag.data_id,
mem.collection_id,
cat.name AS category_name
FROM
t_membership AS mem
LEFT JOIN t_tag AS tag ON
tag.object_id = mem.child_object_id
LEFT JOIN t_object AS object ON
mem.child_object_id = object.object_id
LEFT JOIN t_category AS cat ON
object.category_id = cat.category_id
WHERE
mem.collection_id in
(
SELECT
collection_id
FROM
t_collection
LEFT JOIN t_class ON
t_class.class_id = t_collection.parent_class_id
where
t_class.name <> 'System'
)
)
SELECT
parent_class.name AS parent_class_name,
child_class.name AS child_class_name,
parent_object.object_id AS parent_obj_id,
object.object_id AS object_id,
object.name AS name,
category.name AS category,
property.name AS property_name,
unit.value AS property_unit,
data.value AS property_value,
IFNULL(band.band_id, 1) AS band,
date_from.date AS date_from,
date_to.date AS date_to,
text.value AS text,
text_class.name AS text_class_name,
MAX(CASE WHEN tag_class.name == 'Timeslice' THEN tag_object.name END) AS tag_timeslice,
MAX(CASE WHEN tag_class.name == 'Timeslice' THEN tag_object.object_id END) AS tag_timeslice_objet_id,
MAX(CASE WHEN tag_class.name == 'Data File' THEN tag_object.name END) AS tag_datafile,
MAX(CASE WHEN tag_class.name == 'Data File' THEN tag_object.object_id END) AS tag_datafile_objet_id,
MAX(CASE WHEN tag_class.name == 'Variable' THEN tag_object.name END) AS tag_variable,
MAX(CASE WHEN tag_class.name == 'Variable' THEN tag_object.object_id END) AS tag_variable_objet_id,
action.action_symbol as action,
scenario.name AS scenario
FROM
t_membership membership
LEFT JOIN t_object AS object ON
membership.child_object_id = object.object_id
LEFT JOIN t_category AS category ON
object.category_id = category.category_id
LEFT JOIN t_object AS parent_object ON
membership.parent_object_id = parent_object.object_id
LEFT JOIN t_class AS child_class ON
membership.child_class_id = child_class.class_id
LEFT JOIN t_class AS parent_class ON
membership.parent_class_id = parent_class.class_id
LEFT JOIN t_data AS data ON
membership.membership_id = data.membership_id
LEFT JOIN t_band AS band on
data.data_id = band.data_id
LEFT JOIN t_property AS property ON
data.property_id = property.property_id
LEFT JOIN t_unit AS unit ON
property.unit_id = unit.unit_id
LEFT JOIN t_date_from AS date_from ON
data.data_id = date_from.data_id
LEFT JOIN t_date_to AS date_to ON
data.data_id = date_to.data_id
LEFT JOIN t_tag AS tag ON
data.data_id = tag.data_id
LEFT JOIN t_action AS action ON
tag.action_id = action.action_id
LEFT JOIN scenario_cte AS scenario ON
scenario.data_id = data.data_id
and tag.data_id = scenario.data_id
LEFT JOIN t_text AS text on
text.data_id = data.data_id
LEFT JOIN t_class AS text_class on
text.class_id = text_class.class_id
LEFT JOIN t_object AS tag_object ON
tag_object.object_id = tag.object_id
LEFT JOIN t_class AS tag_class ON
tag_class.class_id = tag_object.class_id
GROUP BY
membership.membership_id,
data.data_id
4 changes: 3 additions & 1 deletion src/plexosdb/schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ CREATE TABLE `t_object`
(
`object_id` INTEGER,
`class_id` INT NULL,
`name` VARCHAR(512) NULL,
`name` VARCHAR(512) NULL COLLATE NOCASE,
`category_id` INT NULL,
`description` VARCHAR(255) NULL,
`GUID` CHAR(36) NOT NULL,
Expand All @@ -245,6 +245,8 @@ CREATE TABLE `t_object`
PRIMARY KEY (`object_id`)
);



CREATE TABLE `t_memo_object`
(
`object_id` INT NOT NULL,
Expand Down
12 changes: 9 additions & 3 deletions src/plexosdb/sqlite.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,17 @@ class PlexosSQLite:
DB_FILENAME = "plexos.db"
_conn: sqlite3.Connection

def __init__(self, xml_fname: str | None = None, xml_handler: XMLHandler | None = None) -> None:
def __init__(
self,
xml_fname: str | None = None,
xml_handler: XMLHandler | None = None,
create_collations: bool = True,
) -> None:
super().__init__()
self._conn = sqlite3.connect(":memory:")
self._sqlite_config()
self._create_collations()
if create_collations:
self._create_collations()
self._create_table_schema()
self._populate_database(xml_fname=xml_fname, xml_handler=xml_handler)

Expand Down Expand Up @@ -1178,7 +1184,7 @@ def _sqlite_config(self):
"""Call all sqlite configuration prior schema creation."""
with self._conn as conn:
conn.execute("PRAGMA synchronous = OFF") # Make it asynchronous
# conn.execute("PRAGMA journal_mode = OFF") # Make it asynchronous
conn.execute("PRAGMA journal_mode = OFF") # Make it asynchronous

def _properties_to_sql_ingest(
self, component_properties: list[dict], memberships: dict, property_ids: dict
Expand Down