basedosdados / website

🖥 Website oficial da BD
http://basedosdados.org
24 stars 9 forks source link

Criar lógica de atualização de última data de `temporal_coverage`. #230

Open rdahis opened 2 years ago

rdahis commented 2 years ago

Contexto

Hoje temos um problema: quando vira o ano temos que atualizar na mão o limite superior do campo temporal_coverage para todos os recursos atualizados periodicamente (ex: bdm_table, external_link). Exemplo: atualizar 2004(1)2020 para 2004(1)2021. Isso já é inviável hoje, e fica cada vez mais conforme o número de conjuntos no banco cresce.

Proposta

fernandascovino commented 2 years ago

@rdahis a unica mudanca aqui de. FE é mostrar mes/dia/etc adicional ao ano nao? nao sei se entendi o que voce colocou

rdahis commented 2 years ago

@rdahis a unica mudanca aqui de. FE é mostrar mes/dia/etc adicional ao ano nao? nao sei se entendi o que voce colocou

Tem uma parte de FE sim, numas funções lá de getTemporalCoverage. Mas relaxa, estou amadurecendo essa ideia e eu mesmo implemento quando chegar a hora.

rdahis commented 1 year ago

Ver discussão no #414 sobre a necessidade ou não de criar o campo is_periodically_updated ou não.

AldemirLucas commented 1 year ago

@rdahis UpdateFrequency ja vai supri isso correto?

rdahis commented 1 year ago

@rdahis UpdateFrequency ja vai supri isso correto?

Não... Mas bem lembrado, vou tentar já incluir esse issue no novo modelo de dados.

rdahis commented 1 year ago

Discussão continua pós https://github.com/basedosdados/backend/pull/67.


Requirements:


Validations to include:


BE logic

last: datetime

year > semester > quarter > month > day > hour > minute > second

def datetime_entity(datetime_range):
    if (datetime_range.start_second or datetime_range.end_second):
        return second
    if (datetime_range.start_minute or datetime_range.end_minute):
        return minute
    if (datetime_range.start_hour or datetime_range.end_hour):
        return hour
    if (datetime_range.start_day or datetime_range.end_day):
        return day
    if (datetime_range.start_month or datetime_range.end_month):
        return month
    if (datetime_range.start_quarter or datetime_range.end_quarter):
        return quarter
    if (datetime_range.start_semester or datetime_range.end_semester):
        return semester
    if (datetime_range.start_year or datetime_range.end_year):
        return year

FE / search logic

def latest_datetime_available():

    if end_*:
        return end_*
    else:
        if datetime_entity(datetime_range) == update_frequency.entity):
            return <entity>(current_datetime) - update_frequency.lag/coverage.interval
        else:
            if updating.last:
                <entity>(last_updated)
                return <entity>(current_datetime) - update_frequency.lag/coverage.interval

Cases to study

case 1:

current: 2023-03 latest: 2022-05 inferred_next_update: 2023-06

case 2:

current: 2023-03 inferred_latest_lower_bound: 2021-02 inferred_latest_upper_bound: 2022-02 inferred_next_update_lower_bound: 2023-06 inferred_next_update_upper_bound: 2023-06

if not last and diff entity, not sure between 0-12 months (or calculated total number of )