Commit eb7aaf77 authored by Jeremy Pallats's avatar Jeremy Pallats 💬
Browse files

Stash changes to queries.

parent 4472b04d
Loading
Loading
Loading
Loading
Loading
+28 −23
Original line number Diff line number Diff line
@@ -969,32 +969,36 @@ def monitor_events(session, system_ids):

    Returns: A list of messages to send.
    """
    current = sqla_orm.aliased(FactionState)
    pending = sqla_orm.aliased(FactionState)

    monitor_states = session.query(FactionState.id).\
        filter(FactionState.text.in_(["Election", "War", "Civil War", "Expansion", "Retreat"])).\
        subquery()
    c_state = session.query(PowerState.id).\
        scalar_subquery()
    control_state_id = session.query(PowerState.id).\
        filter(PowerState.text == "Control").\
        subquery()
        scalar_subquery()

    control_system = sqla_orm.aliased(System)
    events = session.query(Influence.influence, System.name, Faction.name, Government.text,
                           control_system.name, current.text, pending.text).\
    current = sqla_orm.aliased(FactionState)
    pending = sqla_orm.aliased(FactionState)
    sys = sqla_orm.aliased(System)
    sys_control = sqla_orm.aliased(System)
    events = session.query(Influence.influence, sys.name, Faction.name, Government.text,
                           current.text, pending.text,
                           sqla.func.ifnull(sys_control.name, 'N/A').label('control')).\
        filter(Influence.system_id.in_(system_ids),
               sqla.or_(Influence.state_id.in_(monitor_states),
                        Influence.pending_state_id.in_(monitor_states))).\
        filter(Influence.system_id == System.id,
               Influence.faction_id == Faction.id,
               Faction.government_id == Government.id,
               sqla.and_(control_system.power_state_id == c_state,
                         control_system.dist_to(System) <= 15),
               current.id == Influence.state_id,
               pending.id == Influence.pending_state_id).\
        order_by(control_system.name, System.name, current.text, pending.text).\
        join(sys, Influence.system_id == sys.id).\
        join(Faction, Influence.faction_id == Faction.id).\
        join(Government, Faction.government_id == Government.id).\
        join(current, Influence.state_id == current.id).\
        join(pending, Influence.pending_state_id == pending.id).\
        outerjoin(sys_control, sqla.and_(
            sys_control.power_state_id == control_state_id,
            sys_control.dist_to(sys) < 15)
        ).\
        order_by('control', sys.name, current.text, pending.text).\
        limit(1000).\
        all()
    __import__('pprint').pprint(events)

    wars = [["Control", "System", "Faction", "Gov", "Inf", "Current", "Pending"]]
    expansions = wars[:]
@@ -1002,8 +1006,8 @@ def monitor_events(session, system_ids):
    elections = wars[:]

    for event in events:
        states = [event[-2], event[-1]]
        line = [[event[-3], event[1][:16], event[2][:16], event[3][:3],
        states = [event[-3], event[-2]]
        line = [[event[-1], event[1][:16], event[2][:16], event[3][:3],
                 "{:5.2f}".format(round(event[0], 2)), event[-2], event[-1]]]

        if "Election" in states:
@@ -1018,7 +1022,7 @@ def monitor_events(session, system_ids):
        if "Retreat" in states:
            retreats += line

    header = "**__Events in Monitored Systems__**\nMonitoring: {}\n\n**Elections**\n".format(", ".join(WATCH_BUBBLES))
    header = "**__Events in Monitored Systems__**\n\n**Elections**\n"
    msgs = cog.tbl.format_table(elections, header=True, prefix=header)
    msgs += cog.tbl.format_table(wars, header=True, prefix="\n\n**Wars**\n")
    msgs += cog.tbl.format_table(expansions, header=True, prefix="\n\n**Expansions**\n")
@@ -1201,7 +1205,7 @@ def monitor_factions(session, faction_names=None):
                       filter(edb.Faction.name.in_(faction_names)).
                       all()]

    control_id = session.query(PowerState.id).\
    control_state_id = session.query(PowerState.id).\
        filter(PowerState.text == "Control").\
        scalar_subquery()
    matches = session.query(Influence.influence, sys.name, Faction.name,
@@ -1212,11 +1216,12 @@ def monitor_factions(session, faction_names=None):
        join(Faction, Influence.faction_id == Faction.id).\
        join(Government, Faction.government_id == Government.id).\
        join(current, Influence.state_id == current.id).\
        outerjoin(pending, Influence.pending_state_id == pending.id).\
        join(pending, Influence.pending_state_id == pending.id).\
        outerjoin(sys_control, sqla.and_(
            sys_control.power_state_id == control_id,
            sys_control.power_state_id == control_state_id,
            sys_control.dist_to(sys) < 15)
        ).\
        limit(1000).\
        all()

    lines = [["Control", "System", "Faction", "Gov", "Inf",
+25 −1
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@ from sqlalchemy.sql import text as sql_text
import cog.exc
import cog.util
import cogdb.side
from cogdb.side import BGSTick, SystemAge, System, Faction
from cogdb.side import BGSTick, SystemAge, System, Faction, Influence, FactionState


def test_bgstick__repr__(side_session):
@@ -186,6 +186,30 @@ def test_get_system_ages(side_session):
        assert age.control == 'Sol'


def test_monitor_events(side_session):
    #  system_names = ["Sol", "Rana", "Rhea"]
    monitor_states = side_session.query(FactionState.id).\
        filter(FactionState.text.in_(["Election", "War", "Civil War", "Expansion", "Retreat"])).\
        scalar_subquery()
    system_ids = side_session.query(System.id).\
        join(Faction, System.controlling_faction_id == Faction.id).\
        join(FactionState, Faction.state_id == FactionState.id).\
        filter(FactionState.id.in_(monitor_states)).\
        limit(10).\
        all()
    system_ids = [x[0] for x in system_ids]

    __import__('pprint').pprint(system_ids)
    results = cogdb.side.monitor_events(side_session, system_ids)
    __import__('pprint').pprint(results)
    #  with cogdb.session_scope(cogdb.EDDBSession) as eddb_session:
        #  system_ids = eddb_session.query(cogdb.eddb.System.id).\
            #  filter(cogdb.eddb.System.name.in_(system_names)).\
            #  all()
        #  results = cogdb.side.monitor_events(side_session, system_ids)



def test_monitor_factions(side_session):
    faction_names = ["Sol Workers' Party", "Sol Nationalists"]
    results = cogdb.side.monitor_factions(side_session, faction_names)