Что сделать с пустыми полями в, выдерживают сравнение ()?

Это зависит от вашего бэкэнда, но вы хотите разделить сумму суммы на разницу в днях между вашей максимальной и минимальной отметкой времени. В Postgres вы можете просто вычесть две даты, чтобы получить количество дней между ними. В MySQL есть функция DateDiff, которая принимает две даты и возвращает количество дней между ними.

class Date(Func):
    function = 'DATE'

class MySQLDateDiff(Func):
    function = 'DATEDIFF'

    def __init__(self, *expressions, **extra):
        expressions = [Date(exp) for exp in expressions]
        extra['output_field'] = extra.get('output_field', IntegerField())
        super().__init__(*expressions, **extra)

class PgDateDiff(Func):
    template = "%(expressions)s"
    arg_joiner = ' - '

    def __init__(self, *expressions, **extra):
        expressions = [Date(exp) for exp in expressions]
        extra['output_field'] = extra.get('output_field', IntegerField())
        super().__init__(*expressions, **extra)

agg = {
    avg_spend: ExpressionWrapper(
        Sum('amount') / (PgDateDiff(Max('timestamp'), Min('timestamp')) + Value(1)),
        output_field=DecimalField())
}
avg_spend = Payment.objects.aggregate(**agg)

Это выглядит примерно правильно для меня, конечно, я не проверял это. Конечно, используйте MySQLDateDiff, если это ваш бэкэнд.

21
задан Sébastien RoccaSerra 24 September 2008 в 16:00
поделиться

8 ответов

Я предполагаю, что Вы могли обернуть вызов к полю compareTo, метод с небольшим статическим методом отсортировать аннулирует высоко или низко:

static <T extends Comparable<T>> int cp(T a, T b) {
     return
         a==null ?
         (b==null ? 0 : Integer.MIN_VALUE) :
         (b==null ? Integer.MAX_VALUE : a.compareTo(b));
}

Простое использование (несколько полей, как Вы обычно были бы):

public int compare( final Foo o1, final Foo o2 ) {
    return cp(o1.field, o2.field);
}
36
ответ дан 29 November 2019 в 06:35
поделиться

Спасибо за ответы! Общий метод и Google Comparators выглядят интересными.

И я нашел, что существует NullComparator в Apache Наборы палаты общин (который мы в настоящее время используем):

private static class BarComparator
        implements Comparator<Foo>
{
    public int compare( final Foo o1, final Foo o2 )
    {
        // o1.bar & o2.bar nulleness is taken care of by the NullComparator.
        // Easy to extend to more fields.
        return NULL_COMPARATOR.compare(o1.bar, o2.bar);
    }

    private final static NullComparator NULL_COMPARATOR =
                                            new NullComparator(false);
}

Примечание: Я сфокусировался на bar поле здесь для хранения его к точке.

8
ответ дан 29 November 2019 в 06:35
поделиться

Это зависит от того, полагаете ли Вы, что пустая запись, чтобы быть допустимой строкой оценивает ценность сравнения. пустой < или> "яблоко". Единственной вещью, которую я мог сказать наверняка, является тот пустой указатель == пустой указатель. Если можно определить, где пустой указатель вписывается в упорядочивание тогда, можно записать код соответственно.

В этом случае я мог бы принять решение бросить NullPointerExcpetion или IllegalArgumentException и попытаться обработать пустой указатель в более высоком уровне, не поместив его в сравнение во-первых.

6
ответ дан 29 November 2019 в 06:35
поделиться

Ключевая вещь здесь состоит в том, чтобы разработать, как Вы хотели бы, аннулирует, чтобы рассматриваться. Некоторые опции: a) принимают, аннулирует, прибывают перед всеми другими объектами в порядке сортировки b) принимают, аннулирует, прибывают после всех других объектов в порядке сортировки c) пустой указатель обработки, столь же эквивалентный некоторому значению по умолчанию d) обработка, аннулирует как состояния ошибки. Какой, который Вы выбираете, будет зависеть полностью от приложения, Вы продолжаете работать.

В последнем случае, конечно, Вы выдаете исключение. Для других Вам нужен с четырьмя путями, если/еще случай (приблизительно три минуты кодирования того, которое Вы разработали то, чем Вы хотите результаты быть).

2
ответ дан 29 November 2019 в 06:35
поделиться

При использовании наборов Google можно найти эти Компараторы класс полезный. Если имеет вспомогательные методы для упорядочивания, аннулирует или как самое большое или как наименьшее количество элементов в наборе. Можно использовать составные компараторы , чтобы помочь уменьшить объем кода.

2
ответ дан 29 November 2019 в 06:35
поделиться

Это кажется мне нет метода, чтобы сделать это, но так или иначе код не является таким длинным.

1
ответ дан 29 November 2019 в 06:35
поделиться

Вы не должны использовать NullComparator путем, Вы делаете - Вы создаете новый экземпляр класса для каждой операции сравнения, и если, например, Вы сортируете список с 1 000 записей, которые будут 1000 * log2 (1000) объекты, которые являются абсолютно лишними. Это может быстро стать проблематичным.

Или подкласс это или делегат в нем, или просто реализует Вашу собственную пустую проверку - это действительно не что комплекс:

private static class BarComparator
        implements Comparator<Foo> {
    private NullComparator delegate = new NullComparator(false);

    public int compare( final Foo o1, final Foo o2 )
    {
        return delegate.compare(o1.bar, o2.bar);
    }
}
1
ответ дан 29 November 2019 в 06:35
поделиться

Я думаю, что ранние операторы возврата были бы другой альтернативой большому количеству ifs

, например,

if(o1==null) return x;
if(o2==null) return x;
if(o1.getBar()==null) return x;
if(o2.getBar()==null) return x;

// No null checks needed from this point.
0
ответ дан 29 November 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: