powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Правильность выполнения задания. что не так?
25 сообщений из 90, страница 1 из 4
Правильность выполнения задания. что не так?
    #39714060
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
История такая. Взял у фирмы Ardas тестовое для выполнения:

автор
Есть таблица contacts в SQL базе. В ней миллионы строк.

Поле Тип
id 64 bit integer
name varchar

Написать REST сервис hello с ресурсом
/hello/contacts?nameFilter=val

Запрос к contacts должен возвращать контакты из таблицы БД contacts. Параметр nameFilter обязателен. В него передаётся регулярное выражение. В возвращаемых данных не должно быть записей, в которых contacts.name совпадает с регулярным выражением.

Массив контактов возвращается в json формате

авторcontacts: [ Contact, ... ]

Contact
{
“id”: integer,
“name”: string
}

Пример запросов
/hello/contacts?nameFilter=^A.*$ - возвращает контакты, которые НЕ начинаются с A
/hello/contacts?nameFilter=^.*[aei].*$ - возвращает контакты, которые НЕ содержат букв a, e, i

Замечания и пожелания к реализации
Фильтр обязательно применять в java коде, не использовать возможности SQL.

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

Учитывать, что сервис должен быть готов одновременно обрабатывать множество запросов.

SQL БД можно использовать любую, предпочтительно PostgreSQL.

Сервис хотелось бы увидеть на Spring Boot, но не обязательно.

Коды ошибок HTTP использовать типичные для REST сервисов.

Сборка maven

Наличие тестов

К результату приложить объяснение, как развернуть БД, запустить приложение. Было бы здорово, если бы окружение поднималось с помощью Vagrant, виртуализация VirtualBox.




Собственно я выполнил задачу так https://github.com/Tsyklop/MillionContacts

Но человек который смотрел высказал некие недочеты:

авторТребует доработки:
1. Использование String.matches для каждого контакта - неэффективно. // Я переделал на Pattern/Matcher
2. Вычитывать все записи из базы на каждый запрос от каждого пользователя неэффективно
3. Захардкодженый pageSize // В условиях задания об этом ничего не говориться
4. Поиск в базе из миллионна записей занимает 5 минут
5. Отсутствуют тесты. // Тесты более менее написал. Хоть что-то. Ибо сути их все равно понять не могу И что именно тестить тоже.


Тут есть опытные люди. подскажите что можно было сделать иначе? спасибо.
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714064
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор4. Поиск в базе из миллионна записей занимает 5 минутпо скорости - поиск в mysql с использованием like в таблице из 3 000 000 записей -1.3сек.
другие фильтры не применял - потому как смысла в этом нет.
это к тому что дают в заданиях - фигня....
авторВычитывать все записи из базы на каждый запрос от каждого пользователя неэффективновычитывать даже для 1 - глупо
авторИспользование String.matches для каждого контакта - неэффективно. // Я переделал на Pattern/Matcherдля этого существует инструмент самой субд
авторОтсутствуют тесты. // Тесты более менее написал. Хоть что-то. Ибо сути их все равно понять не могу И что именно тестить тоже.+1
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714066
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне еще показалось странным возвращать ResponseEntity из Service
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714067
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

у него в задании написано:
авторФильтр обязательно применять в java коде, не использовать возможности SQ
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714068
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
метод create должен 201 код возвращать
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714070
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Трюк со страницами, как я понял, вы сделали для того, чтобы данные сразу все в память не выгружались. Но тут есть проблема с производительностью, операция offset/skip не бесплатна и чем дальше от начала датасета, тем хуже. Вам нужно было лучше использовать курсор.
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714071
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hettвадя,

у него в задании написано:
авторФильтр обязательно применять в java коде, не использовать возможности SQя это видел...
моё мнение - это глупо.... даже для задания. оно конечно покажет знания java. но есть подозрение что и в дальнейшем будут на этом настаивать - без sql...
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714072
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да собстна учитывая замечание:
авторВычитывать все записи из базы на каждый запрос от каждого пользователя неэффективно

не понятно вообще нафига там субд.
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714075
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettТрюк со страницами, как я понял, вы сделали для того, чтобы данные сразу все в память не выгружались.
Кстати последнюю страниу вы не парсите.
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714079
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklop,

вот явные косяки ваши:
lombok в проект включен, а вы продолжаете писать геттеры и сеттеры

зависимости optional=true - они про отключение транзитивных зависимостей при использовании модулей - не про ваш проект

в задании параметр nameFilter обязателен, а у вас - нет

ORM - это очевидно не про производительность и ваш stream/parallel здесь не в кассу

тестов фактически нет

я так понял что основная претензия про производительность, но чет какая-то херня со стороны проверяющего: кешировать выхлоп нельзя - здесь пользовательский ввод, поэтому это будет DoS (вообще учитывая что матчинг регулярных выражений это NP задача, то само по себе ТЗ - это DoS) - получается нужно в памяти держать, а объемы не известны (или миллионы - значит меньше лярда?), есть ли уверенность что проблема не в ORM?
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714087
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей ПанфиловTsyklop,

вот явные косяки ваши:
lombok в проект включен, а вы продолжаете писать геттеры и сеттеры

зависимости optional=true - они про отключение транзитивных зависимостей при использовании модулей - не про ваш проект

в задании параметр nameFilter обязателен, а у вас - нет

ORM - это очевидно не про производительность и ваш stream/parallel здесь не в кассу

тестов фактически нет

я так понял что основная претензия про производительность, но чет какая-то херня со стороны проверяющего: кешировать выхлоп нельзя - здесь пользовательский ввод, поэтому это будет DoS (вообще учитывая что матчинг регулярных выражений это NP задача, то само по себе ТЗ - это DoS) - получается нужно в памяти держать, а объемы не известны (или миллионы - значит меньше лярда?), есть ли уверенность что проблема не в ORM?


1. Не настолько большой класс что бы юзать lombok. Не считаю это чем-то важным. Или то за что можно придраться.
2. спорить не буду. Но сомневаюсь что эта опция глобально что-то изменит.
4. ну стримом я обрабатываю результат. Так быстрее если без него. Что-то да быстрее.
5. а зачем над ними заморачиваться? я вообще понять не могу их сути. Тратишь кучу времени на написание этого. На счет тестов как-то не особо переживаю. В большинстве компаниях есть отдел тестеров которые тестят.

ну я не понимаю претензию:

автор2. Вычитывать все записи из базы на каждый запрос от каждого пользователя неэффективно


А как иначе то? я уже к кеширование добавил.

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


Просто хочется понять может я тупой или что-то другое...
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714091
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklopавтор2. Вычитывать все записи из базы на каждый запрос от каждого пользователя неэффективно
это зачем стока памяти тратить? и время.
достаточно один раз загрузить в память и с этим "массивом" работать
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714095
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про то что кто-то другой должен за тебя тесты писать, поржал, спасибо. По задаче, КМК, задача на то чтобы пользовательские запросы объединять и за один проход по массиву данных отрабатывать несколько запросов.
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714096
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklopя уже к кеширование добавил. Это вам показалось
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714101
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fixxerПро то что кто-то другой должен за тебя тесты писать, поржал, спасибо. По задаче, КМК, задача на то чтобы пользовательские запросы объединять и за один проход по массиву данных отрабатывать несколько запросов.

Чем это особо поможет? Только усложнит прилично код.
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714105
cossack5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopФильтр обязательно применять в java коде, не использовать возможности SQL.
В spring data можно передать regex. Я бы так сделал (ибо это требование ТЗ - маразм).
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714108
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettfixxerПо задаче, КМК, задача на то чтобы пользовательские запросы объединять и за один проход по массиву данных отрабатывать несколько запросов.
Чем это особо поможет? Только усложнит прилично код.

Повозиться придется, но ничего сверхъестественного писать не нужно. А выгода зависит от нагрузки, чем больше запросов попадает в окно обработки всех записей, тем эффективнее.
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714109
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fixxer,

За счет чего эффективность появится?
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714110
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с ходу что увидал в контроллере.
Код: java
1.
2.
3.
4.
5.
6.
7.
    @RequestMapping(value = "/contacts")
    public ResponseEntity<List<Contact>> contacts(@RequestParam(value = "nameFilter", required = false) String nameFilter) {
        if(nameFilter==null) {
            nameFilter = "";
        }
        return helloService.contacts(nameFilter);
    }


ты можешь дефолтвэлью указать прям в аннотации и сэкономишь три строки кода.

1) далее, по сервису. ты как то странно создаешь инициальные тестовые данные )) это лишнее ) мог бы просто утиль написать или там скуэль скрипт какой. вообще это имхо лишнее в задании. ты еще и дто в конструктор сервиса передаешь (шта?)
2) ты файндолл делаешь с пагинацией по 200 )) а потом из полученной паги тащишь стримом переборку на совпадение. это лишнее от тебя ждали или там джейпиэй типа repository.findByNameLike("whateverString") - это вообще ОДНА строчка на ВЕСЬ МЕТОД вместо твоей требухи,
либо же простым жпкл запросом типа "select entity e where e.name like :param" либо вообще простым скл нативным запросом (как Вадя любит). - всё-равно одна строка.

3) нейминг в целом. но это может я придираюсь. я бы сделал стандартную структуру папок контроллер, сервис, репозиторий, домейн. ну или как то так.

3.1) я не думаю что отдавать ентити как есть клиенту это хорошая идея - я бы заюзал маппер и перекатывал бы ее поля на дтоху которую бы и отдавал. но это наверное и не требовалось.

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

написание тестов к этому коду ну хз.. юниттестиков можно было бы написать с моканьем всех бинов да интеграционный. но тут на написание тестов уйдет времени больше чем на написание кода.
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714111
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорян по первому пункту.. там оказывается дао а не дто.
впрочем, я не сторонник подвязывать всё через конструкторы, я бы сделал с аннотацией автоваер но это холиварный топик. так что пофигу.
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714112
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hettfixxer,

За счет чего эффективность появится?

За счет того, что за один проход по данным отвечаешь на несколько запросов.
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714113
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT,

Ты первое сообщение вообще читал?

Фильтр обязательно применять в java коде, не использовать возможности SQL.


Пример запросов
/hello/contacts?nameFilter=^A.*$ - возвращает контакты, которые НЕ начинаются с A
/hello/contacts?nameFilter=^.*[aei].*$ - возвращает контакты, которые НЕ содержат букв a, e, i


Какой тут LIKE может быть?
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714115
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fixxerЗа счет того, что за один проход по данным отвечаешь на несколько запросов.
А можно увидеть пример такого решения, пожалуйста? уж очень интересно.
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714116
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreykaT1) далее, по сервису. ты как то странно создаешь инициальные тестовые данные )) это лишнее ) мог бы просто утиль написать или там скуэль скрипт какой. вообще это имхо лишнее в задании. ты еще и дто в конструктор сервиса передаешь (шта?)


пример?

andreykaT2) ты файндолл делаешь с пагинацией по 200 )) а потом из полученной паги тащишь стримом переборку на совпадение. это лишнее от тебя ждали или там джейпиэй типа repository.findByNameLike("whateverString") - это вообще ОДНА строчка на ВЕСЬ МЕТОД вместо твоей требухи,
либо же простым жпкл запросом типа "select entity e where e.name like :param" либо вообще простым скл нативным запросом (как Вадя любит). - всё-равно одна строка.


1. Я использую не Spring Data JPA, а Hibernate. У него нет repository.findByNameLike , тут все писать ручками надо.
2. Вы наверно не читали условия. Фильтровать только в Java, в SQL нельзя.

andreykaT3) нейминг в целом. но это может я придираюсь. я бы сделал стандартную структуру папок контроллер, сервис, репозиторий, домейн. ну или как то так.


а сейчас разве не так? controller, dao, service, entity. что не так? dao для хибера, для Spring Data JPA пишут repository.

andreykaT3.1) я не думаю что отдавать ентити как есть клиенту это хорошая идея - я бы заюзал маппер и перекатывал бы ее поля на дтоху которую бы и отдавал. но это наверное и не требовалось.


тут согласен, не учел.

andreykaTв любом случае второй пункт явно указывает что ты скажем так, пока еще не имеешь того опыта который они видимо, ожидают.
написание тестов к этому коду ну хз.. юниттестиков можно было бы написать с моканьем всех бинов да интеграционный. но тут на написание тестов уйдет времени больше чем на написание кода.


Какого такого опыта? в чем именно опыта нет? пытаюсь понять это.
...
Рейтинг: 0 / 0
Правильность выполнения задания. что не так?
    #39714118
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fixxerHettfixxer,

За счет чего эффективность появится?

За счет того, что за один проход по данным отвечаешь на несколько запросов.

Если данные из СУБД каждый раз не загружать (а их можно закэшировать, например в том же сервисе), то проход по данным не такая уж дорогая операция будет (цикл по коллекции), ради которой стоит городить такие ужасные вещи.
...
Рейтинг: 0 / 0
25 сообщений из 90, страница 1 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / Правильность выполнения задания. что не так?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]