Example #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
Example #2
0
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))