def congratulate_sales_rep(row: Order, old_row: Order, logic_row: LogicRow): if logic_row.ins_upd_dlt == "ins" or True: # logic engine fills parents for insert sales_rep = row.SalesRep # type : Employee if sales_rep is None: logic_row.log("no salesrep for this order") else: logic_row.log( f'Hi, {sales_rep.Manager.FirstName}, congratulate {sales_rep.FirstName} on their new order' )
def toggle_order_shipped(): """ toggle Shipped Date, to trigger balance adjustment """ """ also test join. session.query(Customer).join(Invoice).filter(Invoice.amount == 8500).all() """ pre_cust = session.query( models.Customer).filter(models.Customer.Id == "ALFKI").one() session.expunge(pre_cust) print("") test_order = session.query(models.Order).filter( models.Order.Id == 11011).join(models.Employee).one() if test_order.ShippedDate is None or test_order.ShippedDate == "": test_order.ShippedDate = str(datetime.now()) print( prt("Shipping order - ShippedDate: ['' -> " + test_order.ShippedDate + "]")) else: test_order.ShippedDate = None print(prt("Returning order - ShippedDate: [ -> None]")) insp = inspect(test_order) # session.commit() print("") post_cust = session.query( models.Customer).filter(models.Customer.Id == "ALFKI").one() logic_row = LogicRow(row=pre_cust, old_row=post_cust, ins_upd_dlt="*", nest_level=0, a_session=session, row_cache=None) if abs(post_cust.Balance - pre_cust.Balance) == 960: logic_row.log("Correct adjusted Customer Result") assert True else: row_prt(post_cust, "\nERROR - incorrect adjusted Customer Result") print("\n--> probable cause: Order customer update not written") row_prt(pre_cust, "\npre_alfki") assert False
def before_flush(a_session: session, a_flush_context, an_instances): """ Logic Execution processes LogicRows: row and old_row Note old_row is critical for: * user logic (did the value change? by how much?) * performance / pruning (skip rules iff no dependent values change) * performance / optimization (1 row adjustments, not expensive select sum/count) """ logic_engine.logic_logger.debug( "\nLogic Phase (sqlalchemy before_flush)\t\t\t") # print("\n***************** sqlalchemy calls logic_engine\n") row_cache = RowCache() what_is = a_session.dirty for each_instance in a_session.dirty: table_name = each_instance.__tablename__ old_row = get_old_row(each_instance) logic_row = LogicRow(row=each_instance, old_row=old_row, ins_upd_dlt="upd", nest_level=0, a_session=a_session, row_cache=row_cache) logic_row.update(reason="client") for each_instance in a_session.new: table_name = each_instance.__tablename__ logic_row = LogicRow(row=each_instance, old_row=None, ins_upd_dlt="ins", nest_level=0, a_session=a_session, row_cache=row_cache) logic_row.insert(reason="client") logic_engine.logic_logger.debug("Commit Logic Phase \t\t\t") for each_logic_row_key in row_cache.row_list: each_logic_row = row_cache.row_list[each_logic_row_key] logic_engine.engine_logger.debug("visit: " + each_logic_row.__str__()) commit_row_events = rule_bank_withdraw.rules_of_class( each_logic_row, CommitRowEvent) for each_row_event in commit_row_events: each_logic_row.log("Commit Event") each_row_event.execute(each_logic_row) logic_engine.logic_logger.debug("Flush Phase \t\t\t")
def before_flush(a_session: session, a_flush_context, an_instances): print("logic.logic_exec.listeners>before_flush BEGIN") for each_instance in a_session.dirty: table_name = each_instance.__tablename__ print("logic.logic_exec.listeners>before_flush flushing Dirty! " + str(table_name) + "]--> " + str(each_instance)) for each_instance in a_session.new: table_name = each_instance.__tablename__ print("logic.logic_exec.listeners>before_flush flushing New! " + str(table_name) + "]--> " + str(each_instance)) logic_row = LogicRow(row=each_instance, old_row=None, nest_level=0, ins_upd_dlt="ins") row_logic_exec = RowLogicExec(logic_row=logic_row) row_logic_exec.insert() # print("logic.logic_exec.listeners>before_flush RuleBank: " + rb.__str__()) print("logic.logic_exec.listeners>before_flush END")
models.Order).filter(models.Order.Id == 11011).one() # type : Order amount_total = test_order.AmountTotal if test_order.CustomerId == "ALFKI": test_order.CustomerId = "ANATR" else: test_order.CustomerId = "ALFKI" print(prt("Reparenting order - new CustomerId: " + test_order.CustomerId)) insp = inspect(test_order) session.commit() print("") post_alfki = session.query( models.Customer).filter(models.Customer.Id == "ALFKI").one() logic_row = LogicRow(row=pre_alfki, old_row=post_alfki, ins_upd_dlt="*", nest_level=0, a_session=session, row_cache=None) if abs(post_alfki.Balance - pre_alfki.Balance) == 960: logic_row.log("Correct non-adjusted Customer Result") assert True else: row_prt(post_alfki, "\nERROR - incorrect adjusted Customer Result") print("\n--> probable cause: Order customer update not written") row_prt(pre_alfki, "\npre_alfki") assert False post_anatr = session.query( models.Customer).filter(models.Customer.Id == "ANATR").one() logic_row = LogicRow(row=pre_anatr,
from logic_engine.exec_row_logic.logic_row import LogicRow from nw.nw_logic import session # opens db, activates logic listener <-- """ toggle Shipped Date, to trigger balance adjustment """ """ also test join. session.query(Customer).join(Invoice).filter(Invoice.amount == 8500).all() """ pre_cust = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() session.expunge(pre_cust) test_order = session.query(models.Order).filter(models.Order.Id == 11011).join(models.Employee).one() if test_order.ShippedDate is None or test_order.ShippedDate == "": test_order.ShippedDate = str(datetime.now()) print("shipping: ['' -> " + test_order.ShippedDate + "]") else: test_order.ShippedDate = "" print("returning ['xxx' -> " + test_order.ShippedDate + "]") # ship this unshipped order (dates are like 2014-03-24) # a_session.query(models.Order).update(test_order) # Order not iterable insp = inspect(test_order) session.commit() post_cust = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() logic_row = LogicRow(row=pre_cust, old_row=post_cust, nest_level=0, ins_upd_dlt="*") debug = logic_row.__str__() print("Customer LogicRow: " + debug) print("\nupd_order, completed\n\n") # TODO check Customer Balance correctly adjusted