Exemple #1
0
def _build_libration_query(asteroid_condition: AsteroidCondition,
                           planet_condtion: PlanetCondition,
                           is_pure: bool, is_apocentric: bool,
                           axis_interval: AxisInterval, integers: List[str],
                           body_count: BodyNumberEnum, limit=100, offset=0) -> Query:

    builder = GetQueryBuilder(body_count, True)
    resonance_cls = builder.resonance_cls
    is_three = (body_count == BodyNumberEnum.three)
    libration_cls = Libration if is_three else TwoBodyLibration
    t5 = aliased(libration_cls)
    query = builder.get_resonances() \
        .outerjoin(t5, resonance_cls.libration) \
        .options(contains_eager(resonance_cls.libration, alias=t5)) \
        .filter(t5.id.isnot(None))

    t1 = PLANET_TABLES['first_body']
    t2 = PLANET_TABLES['second_body']
    t3 = builder.asteroid_alias

    if asteroid_condition:
        query = query.filter(t3.number >= asteroid_condition.start,
                             t3.number < asteroid_condition.stop)

    if planet_condtion:
        if planet_condtion.first_planet_name:
            query = query.filter(t1.name == planet_condtion.first_planet_name)
        if planet_condtion.second_planet_name:
            query = query.filter(t2.name == planet_condtion.second_planet_name)

    if is_pure is not None:
        query = query.filter(t5.is_pure == is_pure)

    if is_apocentric is not None:
        query = query.filter(t5.is_apocentric == is_apocentric)

    if axis_interval:
        query = query.filter(t3.axis > axis_interval.start, t3.axis < axis_interval.stop)

    if integers:
        tables = [t1]
        if is_three:
            tables.append(t2)
        tables.append(t3)
        query = add_integer_filter(query, integers, tables)

    query = query.limit(limit).offset(offset)
    return query
Exemple #2
0
def show_planets(body_count: int):
    body_count = BodyNumberEnum(body_count)
    libration_cls = Libration if body_count == BodyNumberEnum.three else TwoBodyLibration
    builder = GetQueryBuilder(body_count)
    query = builder.get_planets()\
        .outerjoin(libration_cls,
                   libration_cls.__table__.c.resonance_id == builder.resonance_cls.id)\
        .add_column(func.count(builder.resonance_cls.id))\
        .add_column(func.count(libration_cls.id))
    table = Texttable(max_width=80)
    table.add_row(['%s planet' % (x+1) for x in range(body_count.value - 1)] +
                  ['resonances', 'librations'])
    for item in query:
        table.add_row(item)

    print(table.draw())