Source code for data.OXDatabase

"""
OXDatabase Module
=================

This module provides a specialized container class for managing collections of OXData objects
in the OptiX optimization framework. It implements type-safe storage and retrieval operations
specifically designed for data objects with scenario support.

The OXDatabase class extends OXObjectPot to provide enhanced data management capabilities
including filtering, searching, and batch operations on data objects while maintaining
strict type safety to ensure only OXData instances are stored.

Key Features:
    - **Type Safety**: Enforces that only OXData objects can be added or removed
    - **Container Operations**: Full iterator and length support for data collections
    - **Object Management**: UUID-based object identification and relationship tracking
    - **Scenario Integration**: Works seamlessly with OXData scenario management

Architecture:
    The OXDatabase class inherits from OXObjectPot but adds specific validation to ensure
    that only OXData objects are managed. This provides both the flexibility of the base
    container class and the type safety required for data object management.

Example:
    Basic usage of OXDatabase for managing data objects:

    .. code-block:: python

        from data.OXDatabase import OXDatabase
        from data.OXData import OXData
        
        # Create a database and data objects
        db = OXDatabase()
        
        # Create demand data with scenarios
        demand1 = OXData()
        demand1.location = "Factory_A"
        demand1.quantity = 100
        demand1.create_scenario("High_Season", quantity=150)
        
        demand2 = OXData()
        demand2.location = "Factory_B" 
        demand2.quantity = 80
        demand2.create_scenario("High_Season", quantity=120)
        
        # Add objects to database
        db.add_object(demand1)
        db.add_object(demand2)
        
        # Iterate through all data objects
        for data in db:
            print(f"Location: {data.location}, Quantity: {data.quantity}")
        
        # Access by UUID
        found_data = db.get_object_by_id(demand1.id)

Module Dependencies:
    - dataclasses: For structured data class definitions
    - base: For OXObjectPot container base class and exception handling
    - data.OXData: For OXData type validation and integration

Notes:
    - Only OXData instances can be added to or removed from the database
    - The database maintains all OXObjectPot functionality including UUID-based lookups
    - Type validation occurs at runtime during add/remove operations
    - The database works transparently with OXData scenario switching
"""

from dataclasses import dataclass

from base import OXObjectPot, OXObject, OXception
from data.OXData import OXData


[docs] @dataclass class OXDatabase(OXObjectPot): """A container for OXData objects. This class extends OXObjectPot to provide a container specifically for OXData objects. It enforces type safety by ensuring that only OXData objects can be added to or removed from the database. Examples: >>> db = OXDatabase() >>> data1 = OXData() >>> data2 = OXData() >>> db.add_object(data1) >>> db.add_object(data2) >>> len(db) 2 >>> for data in db: ... print(data.id) 12345678-1234-5678-1234-567812345678 87654321-4321-8765-4321-876543210987 See Also: :class:`base.OXObjectPot.OXObjectPot` :class:`data.OXData.OXData` """
[docs] def add_object(self, obj: OXObject): """Add an OXData object to the database. Args: obj (OXObject): The object to add. Must be an instance of OXData. Raises: OXception: If the object is not an instance of OXData. """ if not isinstance(obj, OXData): raise OXception("Only OXData can be added to OXDatabase") super().add_object(obj)
[docs] def remove_object(self, obj: OXObject): """Remove an OXData object from the database. Args: obj (OXObject): The object to remove. Must be an instance of OXData. Raises: OXception: If the object is not an instance of OXData. ValueError: If the object is not in the database. """ if not isinstance(obj, OXData): raise OXception("Only OXData can be removed from OXDatabase") super().remove_object(obj)