Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Правильность выполнения задания. что не так? / 25 сообщений из 90, страница 1 из 4
07.10.2018, 16:50
    #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
07.10.2018, 17:06
    #39714064
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильность выполнения задания. что не так?
автор4. Поиск в базе из миллионна записей занимает 5 минутпо скорости - поиск в mysql с использованием like в таблице из 3 000 000 записей -1.3сек.
другие фильтры не применял - потому как смысла в этом нет.
это к тому что дают в заданиях - фигня....
авторВычитывать все записи из базы на каждый запрос от каждого пользователя неэффективновычитывать даже для 1 - глупо
авторИспользование String.matches для каждого контакта - неэффективно. // Я переделал на Pattern/Matcherдля этого существует инструмент самой субд
авторОтсутствуют тесты. // Тесты более менее написал. Хоть что-то. Ибо сути их все равно понять не могу И что именно тестить тоже.+1
...
Рейтинг: 0 / 0
07.10.2018, 17:20
    #39714066
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильность выполнения задания. что не так?
Мне еще показалось странным возвращать ResponseEntity из Service
...
Рейтинг: 0 / 0
07.10.2018, 17:22
    #39714067
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильность выполнения задания. что не так?
вадя,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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


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

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

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

За счет чего эффективность появится?
...
Рейтинг: 0 / 0
07.10.2018, 20:11
    #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
07.10.2018, 20:14
    #39714111
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильность выполнения задания. что не так?
сорян по первому пункту.. там оказывается дао а не дто.
впрочем, я не сторонник подвязывать всё через конструкторы, я бы сделал с аннотацией автоваер но это холиварный топик. так что пофигу.
...
Рейтинг: 0 / 0
07.10.2018, 20:16
    #39714112
fixxer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильность выполнения задания. что не так?
Hettfixxer,

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

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

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

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


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


Какой тут LIKE может быть?
...
Рейтинг: 0 / 0
07.10.2018, 20:25
    #39714115
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильность выполнения задания. что не так?
fixxerЗа счет того, что за один проход по данным отвечаешь на несколько запросов.
А можно увидеть пример такого решения, пожалуйста? уж очень интересно.
...
Рейтинг: 0 / 0
07.10.2018, 20:31
    #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
07.10.2018, 20:36
    #39714118
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильность выполнения задания. что не так?
fixxerHettfixxer,

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

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

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


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