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
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())