Skip to content

Commit

Permalink
1.8.3 - Column as derive arg type
Browse files Browse the repository at this point in the history
  • Loading branch information
valhuber committed Mar 4, 2023
1 parent 6f501c5 commit cfcf0cb
Show file tree
Hide file tree
Showing 9 changed files with 57 additions and 28 deletions.
2 changes: 1 addition & 1 deletion .idea/LogicBank.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 26 additions & 2 deletions .idea/dataSources.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file modified examples/nw/db/database.db
Binary file not shown.
28 changes: 15 additions & 13 deletions examples/nw/db/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
The primary copy is here -- copy changes to basic_web_app/app.
on relationships...
* declare them in the parent (not child), eg, for Order:
* OrderDetailList = relationship("OrderDetail", backref="OrderHeader", cascade_backrefs=True)
* OrderDetailList = relationship("OrderDetail", backref="OrderHeader", cascade_backrefs=False)
"""
import sqlalchemy

from logic_bank import logic_bank # import this first - import ordering

Expand Down Expand Up @@ -78,7 +79,7 @@ def total_ordered(self, value): # @paid_order_count.setter => python stack over
cascade="all, delete",
# passive_deletes=True, # means database RI will do the deleting... which SQLlite *never* does
# use this *only* when DBMS does cascade deletes, to run LogicBank delete logic
cascade_backrefs=True)
cascade_backrefs=False)


class CustomerDemographic(Base):
Expand Down Expand Up @@ -124,13 +125,13 @@ class Employee(Base):
WorksFor = Column(ForeignKey('Department.Id'), nullable=False)
OnLoan = Column(ForeignKey('Department.Id'), nullable=False)

OrderList = relationship("Order", cascade_backrefs=True, backref="SalesRep")
OrderList = relationship("Order", cascade_backrefs=False, backref="SalesRep")
# https://stackoverflow.com/questions/2638217/sqlalchemy-mapping-self-referential-relationship-as-one-to-many-declarative-f
Manager = relationship('Employee', remote_side='Employee.Id',
backref='Manages') # parent Company
TerritoryList = relationship("EmployeeTerritory", cascade_backrefs=True, backref="Employee")
TerritoryList = relationship("EmployeeTerritory", cascade_backrefs=False, backref="Employee")

EmployeeAuditList = relationship("EmployeeAudit", cascade_backrefs=True, backref="Employee")
EmployeeAuditList = relationship("EmployeeAudit", cascade_backrefs=False, backref="Employee")

Works_for_dept = relationship('Department', remote_side='Department.Id',
foreign_keys="Employee.WorksFor",
Expand Down Expand Up @@ -178,7 +179,7 @@ class Product(Base):
Discontinued = Column(Integer, nullable=False)
UnitsShipped = Column(Integer, nullable=False)

OrderList = relationship("OrderDetail", cascade_backrefs=True, backref="ProductOrdered")
OrderList = relationship("OrderDetail", cascade_backrefs=False, backref="ProductOrdered")



Expand Down Expand Up @@ -221,7 +222,7 @@ class Territory(Base):
TerritoryDescription = Column(String(8000))
RegionId = Column(Integer, nullable=False)

EmployeeList = relationship("EmployeeTerritory", cascade_backrefs=True, backref="Territory")
EmployeeList = relationship("EmployeeTerritory", cascade_backrefs=False, backref="Territory")


class CustomerCustomerDemo(Base):
Expand Down Expand Up @@ -283,18 +284,19 @@ class Order(Base):
backref="OrderHeader",
cascade="all, delete",
# passive_deletes=True, # means database RI will do the deleting (never for SqlLite)
cascade_backrefs=True)
cascade_backrefs=False)

# https://docs.sqlalchemy.org/en/13/orm/mapped_sql_expr.html


"""
Customer.total_ordered_sql = column_property(
select([sqlalchemy.sql.functions.sum(Order.AmountTotal)]).where(Order.CustomerId == Customer.Id))
"""
Customer.total_ordered_sql = column_property(
select([func.sum(Order.AmountTotal)]). \
where(Order.CustomerId == Customer.Id))
select(sqlalchemy.sql.functions.sum(Order.AmountTotal)).where(Order.CustomerId == Customer.Id))

Employee.order_count_sql = column_property(
select([func.count(Order.Id)]). \
where(Order.Id == Order.EmployeeId))
select(sqlalchemy.sql.functions.count(Order.Id)).where(Order.Id == Order.EmployeeId))


class OrderDetail(Base):
Expand Down
8 changes: 6 additions & 2 deletions examples/nw/tests/test_upd_employee_audit.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,16 @@ def test_run(self):
Test 2 - alter Salary, ensure EmployeeAudit created
"""

print("\n\nTest 2 - alter Salary, ensure EmployeeAudit created")
print("\n\nTest 2 - alter Salary, ensure EmployeeAudit created (from NWRuleExtension.nw_copy_row)")
test_emp = session.query(models.Employee).filter(models.Employee.Id == 1).one()
test_emp.Salary = test_emp.Salary * Decimal(1.5)
session.commit()

print("")
test_emp_audit = session.query(models.EmployeeAudit).one()
# test_emp_audit = session.query(models.EmployeeAudit).one()
query = session.query(models.EmployeeAudit)
print(f" .. test_emp_audit - did query, count = {query.count()}")
test_emp_audit = query.one()
print(f" .. test_emp_audit {test_emp_audit.LastName}")
if test_emp_audit is None:
self.fail("Failure - audit row not created on Salary change")
13 changes: 6 additions & 7 deletions logic_bank/logic_bank.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
from typing import Callable, Sequence

from sqlalchemy import Column
from sqlalchemy.orm.attributes import InstrumentedAttribute
from sqlalchemy.orm import session

from logic_bank.rule_bank import rule_bank_withdraw # reduce circular imports
import logic_bank.rule_bank.rule_bank_setup as rule_bank_setup
from logic_bank.rule_type.constraint import Constraint
Expand Down Expand Up @@ -84,7 +83,7 @@ class Rule:
"""

@staticmethod
def sum(derive: InstrumentedAttribute, as_sum_of: any, where: any = None, child_role_name: str = ""):
def sum(derive: Column, as_sum_of: any, where: any = None, child_role_name: str = ""):
"""
Derive parent column as sum of designated child column, optional where
Expand All @@ -105,7 +104,7 @@ def sum(derive: InstrumentedAttribute, as_sum_of: any, where: any = None, child_
return Sum(derive, as_sum_of, where, child_role_name)

@staticmethod
def count(derive: InstrumentedAttribute, as_count_of: object, where: any = None, child_role_name: str = ""):
def count(derive: Column, as_count_of: object, where: any = None, child_role_name: str = ""):
"""
Derive parent column as count of designated child rows
Expand All @@ -117,7 +116,7 @@ def count(derive: InstrumentedAttribute, as_count_of: object, where: any = None,
Args:
derive: name of parent <class.attribute> being derived
as_sum_of: name of child <class> being counted
as_count_of: name of child <class> being counted
child_role_name: parent's child accessor attribute (required only for disambiguation)
where: optional where clause, designates which child rows are counted
"""
Expand Down Expand Up @@ -187,7 +186,7 @@ def parent_check(validate: object,
return ParentCheck(validate=validate, error_msg=error_msg, enable=enable)

@staticmethod
def formula(derive: InstrumentedAttribute,
def formula(derive: Column,
as_exp: str = None, # string (for very short expression)
as_expression: Callable = None,
calling: Callable = None,
Expand All @@ -213,7 +212,7 @@ def formula(derive: InstrumentedAttribute,
no_prune=no_prune)

@staticmethod
def copy(derive: InstrumentedAttribute, from_parent: any):
def copy(derive: Column, from_parent: any):
"""
Copy declares child column copied from parent column
Expand Down
2 changes: 1 addition & 1 deletion logic_bank/rule_bank/rule_bank_setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from sqlalchemy.orm import session
import logging

__version__ = "01.08.00"
__version__ = "01.08.03"


def setup(a_session: session):
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
python-dateutil==2.8.1
six==1.15.0
SQLAlchemy>=1.4.29
SQLAlchemy==1.4.29
# SQLAlchemy-Utils==0.36.8
LogicBankUtils

0 comments on commit cfcf0cb

Please sign in to comment.