Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 7 8 9 [10]      все
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1007
PetroNotC Sharp
Zzz79,
1 про количество if и наличие циклов ерунда. Так 16ти летки говорят.
2. скорость запроса и тюнинг после цифр о том что там не устраивает.

совсем не ерунда,если тебе нужно больше двух иф - значит проблема в архитектуре ,по крайне мере так пишет Роберт Мартин,с ним я в целом согласен - жава гибкая и помогает избежать такого количества условий- а если нет ,значит однозначно вы делаете костыль)
18 ноя 20, 11:17    [22234433]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1007
вот такой вариант собрал с учетом мнения большинства форумчан,оттестировал все работает

import org.springframework.stereotype.Service;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.List;
import java.util.Optional;

@Service
public class UnsuberRepositoryCustomImpl implements UnsuberRepositoryCustom {

    @PersistenceContext
    private EntityManager em;

    private final Timestamp MIN_VALUE = Timestamp.valueOf("1970-01-01 00:00:00");
    private final Timestamp MAX_VALUE = Timestamp.valueOf("2038-01-01 00:00:00");


    @Override
    public List<Object[]> unsuberList(Long spaceId, UnsuberRequest request) {

        Query query = getQuery(request);

        Timestamp fr = request == null ? MIN_VALUE : Optional.ofNullable(converter(request.getDateFrom()))
                .orElse(MIN_VALUE);
        Timestamp to = request == null ? MAX_VALUE : Optional.ofNullable(converter(request.getDateTo()))
                .orElse(MAX_VALUE);
        
        int pos = 1;

        query.setParameter(pos++, spaceId);
        query.setParameter(pos++, fr);
        query.setParameter(pos++, to);
        if (request != null && request.getPid() != null) {
            query.setParameter(pos, Long.valueOf(request.getPid()));
        }

        return query.getResultList();

    }

    private Query getQuery(UnsuberRequest request) {

        String pollIdPredicate = request == null || request.getPid() == null ? "" : "and p.id = ? ";

        Query query = em.createNativeQuery("select me.email , CAST (pc.poll_id as varchar ) , CAST ((select extract (epoch from me.unsubscribe_date)) as varchar ) " +
                "from space s " +
                "join \"user\" u on (s.id = u.space_id) " +
                "join poll p on (u.id = p.user_id) " +
                "join poll_channel pc on (p.id  =pc.poll_id) " +
                "join mailing m on (pc.id = m.poll_channel_id) " +
                "join mailing_list_email mle on (m.id = mle.mailing_id) " +
                "join mailing_email me on (mle.email_id = me.id) " +
                "where s.id = ? " +
                "and me.unsubscribed = 'true' " +
                "and me.unsubscribe_date between ? and ? " +
                pollIdPredicate);

        return query;
    }

    private Timestamp converter(Integer i) {
        if (i == null) {
            return null;
        }
        return Timestamp.from(Instant.ofEpochSecond(i));

    }

    private String getSpaceIdByXApiKey(String xAPiKey) {
        //ToDO реализовать механизм поиска группы по X-API-KEY
        return "";
    }
}
18 ноя 20, 11:18    [22234434]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1007
Leonid Kudryavtsev
Я бы так делал:

query.setParameter (pos++, to );

последняя инкрементация лишняя ,соеденил ваш вариант + майтона
18 ноя 20, 11:20    [22234435]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79
PetroNotC Sharp
Zzz79,
1 про количество if и наличие циклов ерунда. Так 16ти летки говорят.
2. скорость запроса и тюнинг после цифр о том что там не устраивает.

совсем не ерунда,если тебе нужно больше двух иф - значит проблема в архитектуре ,по крайне мере так пишет Роберт Мартин,с ним я в целом согласен - жава гибкая и помогает избежать такого количества условий- а если нет ,значит однозначно вы делаете костыль)

Про архитектуру тебе пока рано.
Ты слово Модель не выучил. Только аннотации.
18 ноя 20, 11:23    [22234437]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
вадя
Leonid Kudryavtsev
несколько таких конструкций в результирующем запросе - запросто убьет и оптимизатор и план
проверял?
на таком простом запросе потери будут минимальны


Простота запроса не при чем. Убивается оптимизатор, использование индексов (кроме одного) и соответственно план.
18 ноя 20, 11:36    [22234444]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49768
Zzz79
mayton
И переменные.

                query.setParameter(1, spaceId);
                query.setParameter(2, fr);
                query.setParameter(3, to);
                if (request != null && request.getPid() != null) {
                            query.setParameter(4, Long.valueOf(request.getPid()));                            
                } 

вот этот вариант самый читаемый для пользователя,все-таки инкрементация в биндинге такое себе.
Осталось понять не повлияет ли это на производительность ,так как по уму сначала фильтруем по группе( spaceId) потом по опросу( pollId) потом по датам уже ,не получится ли так что мы при введеном pollId все равно сначала и только потом фильтранем по pollId
либо же where запрос работает как единое целое и ему пох в каком порядке стоят фильтры.

Порядок применения предикатов не регламентируется SQL. Тоесть грубо говоря
регламентирован только результат но не способ его достижения.

Некоторые DBMS могут учитывать порядок выражений в WHERE.
Но я готов спорить на виски что в большинстве случаев для DBMS
важно

1) Наличие индекса по предикату (или композитного индекса или партишенинга или кластеризованного индекса)
2) Наличие предположения о селективности на основе статистики которую база хранит для каждой колонки.
18 ноя 20, 13:54    [22234575]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1007
mayton,

понял спасибо

хочу все таки отойти от хардкода и заменить условия на where unsub_date>= ? или where unsub_date <= ?
собственно это будут от или до
если заданы два значения делать between
а если значений нет ,то и фильтрации по времени нет

все таки мне это кажется более логичным ,чем хардкодить конечные даты
18 ноя 20, 15:55    [22234701]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1007
Хотя я так понимаю unix имеет ограниченный лимит с 1970 по 2038 год - что в принципе оправдаывает конструкцию ,которая у меня сейчас
18 ноя 20, 16:08    [22234715]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Ржавый гвоздь
Member

Откуда:
Сообщений: 116
Тема просто треш какой-то Несколько страниц обсуждать, как затемплейтить примитивный запрос
18 ноя 20, 16:22    [22234725]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
Ржавый гвоздь
Тема просто треш какой-то Несколько страниц обсуждать, как затемплейтить примитивный запрос


Солдат спит, служба идет.

Обсуждение на sql.ru, а зарплата идет.
18 ноя 20, 16:24    [22234727]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Ржавый гвоздь
Тема просто треш какой-то Несколько страниц обсуждать, как затемплейтить примитивный запрос

)))
Тюнить бд и думать ставить between или нет с завязанными глазами.
))))
18 ноя 20, 16:27    [22234731]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1007
Ржавый гвоздь
Тема просто треш какой-то Несколько страниц обсуждать, как затемплейтить примитивный запрос

ну так покажи свой код,посмотрим что у тебя там за запросы уровня "NASA" ,наверняка есть что показать,не зря же ты тут свой высер оставил многозначительный)


а по теме какие задачи ставят ,такие и решения))

вот у меня в задаче написано

 UNIX timestamp GMT (время в секундах)
 UNIX timestamp  (время в секундах)

ведь человек это писавший думает что в время отображенное как количесво секунд от 1970 года имеет диферинцацию по тайм зонам))
18 ноя 20, 16:47    [22234758]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
Zzz79

....ведь человек это писавший думает что в время отображенное как количесво секунд от 1970 года имеет диферинцацию по тайм зонам))

а 1970 год наступил сразу же? одновременно по всей планете?

каким образом отображение времени и наличие/отстутствие тайм зоны связано между собой - для меня загадка
18 ноя 20, 16:52    [22234763]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1007
Leonid Kudryavtsev
Zzz79

....ведь человек это писавший думает что в время отображенное как количесво секунд от 1970 года имеет диферинцацию по тайм зонам))

а 1970 год наступил сразу же? одновременно по всей планете?

каким образом отображение времени и наличие/отстутствие тайм зоны связано между собой - для меня загадка

загуглите что такое unix timestamp ,чтобы для вас не оставалось загадок))
ну хотя ладно я сделаю это для вас,так как вы мне тоже помогли

The definition of UNIX timestamp is timezone independent. The timestamp is the number of seconds (or milliseconds) elapsed since an absolute point in time, midnight of Jan 1 1970 in UTC time


тоесть как бы unix time oн везде один и тот же,будь ты на чукотке или в калининграде
18 ноя 20, 17:21    [22234779]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49768
Zzz79
mayton,

понял спасибо

хочу все таки отойти от хардкода и заменить условия на where unsub_date>= ? или where unsub_date <= ?
собственно это будут от или до
если заданы два значения делать between
а если значений нет ,то и фильтрации по времени нет

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

Можно вообще уйти от работы с датами и работать с целыми числами в виде Unix Timestamp.
Кажется в java.sql.Timestamp должен быть метод для извлечения секунд.
Тогда MIN/MAX value будут просто пограничными значениями для integer/long
(секунды/милисекунды). Это дает некую однородность при работе с проверками
на больше/меньше/равно. Такие проверки всегда надёжно работают т.к. нет
погрешностей перевода типа потерянных секунд в сутках или долей секунд
если формат дат более грубый чем точность timestamp.

Можно воспользоваться советом от 22231474. В базовом варианте Ansi-SQL
любое сравнение с Null дает либо неопределённость либо false. Вобщем надо покумекать
какую таблицу истинности даст SELECT для трех вариантов интервала. Открытый слева.
Открытый справа. Закрытый.

Можно перенести логику проверки условия на бесконечность в SQL в виде switch/case
выражения типа.

      CASE  
         WHEN fr is NULL THEN fr = date '2038-01-01 00:00:00'
         ELSE fr
       END  


В этом случае она уходит из Java кода. Возможно будет красивее.
18 ноя 20, 18:04    [22234819]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
mayton
В этом случае она уходит из Java кода. Возможно будет красивее.
я это предложил ещё много страниц назад
18 ноя 20, 23:05    [22234993]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1007
вадя
mayton
В этом случае она уходит из Java кода. Возможно будет красивее.
я это предложил ещё много страниц назад

такое не прокатит - очень большой объем данных
для проектов уровня петро проктит,в моем случае нет)
18 ноя 20, 23:10    [22234997]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
Zzz79,

кто это тебе скзал?
ты сначала проверь
18 ноя 20, 23:17    [22234999]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
вадя,
Ну я помню его проект цветочного магазина. Где юзвери были строками ФИО без FK))))
19 ноя 20, 08:07    [22235071]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
PetroNotC Sharp
Ну я помню его проект цветочного магазина. Где юзвери были строками ФИО без FK))))
ну если только так
19 ноя 20, 08:21    [22235076]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 7 8 9 [10]      все
Все форумы / Java Ответить