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 get_resonances( start: int, stop: int, only_librations: bool, planets: Tuple[str, ...], integers: List[str] = None ) -> Iterable[ResonanceMixin]: """ Returns resonances related to asteroid in pointer interval from start to stop. :param integers: :param planets: :param start: start of interval of asteroid numbers. :param stop: finish of interval of asteroid numbers. :param only_librations: flag indicates about getting resonances, that has related librations with pointed in settings. :return: """ body_count = BodyNumberEnum(len(planets) + 1) builder = GetQueryBuilder(body_count, True) resonances = builder.get_resonances() t1 = builder.asteroid_alias for i, key in enumerate(FOREIGNS): if i >= (body_count.value - 1): break resonances = resonances.filter(PLANET_TABLES[key].name == planets[i]) resonances = ( resonances.filter(t1.number >= start, t1.number < stop) .options(joinedload("libration")) .order_by(builder.asteroid_alias.number) ) if integers: tables = [PLANET_TABLES["first_body"]] if body_count == BodyNumberEnum.three: tables.append(PLANET_TABLES["second_body"]) tables.append(builder.asteroid_alias) resonances = add_integer_filter(resonances, integers, tables) if only_librations: resonances = resonances.join("libration") is_empty = True for resonance in resonances: is_empty = False yield resonance if is_empty: logging.info("We have no resonances, try command load-resonances --start=%i --stop=%i" % (start, stop))