LINUX.ORG.RU
ФорумAdmin

Выборка значений из Redmine

 , , ,


0

1

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

#!/bin/sh
NOW=`date +%d%m%y`
mysql -u root -ppassword -e  "use redmine; \
SELECT issues.id, name FROM projects \
INNER JOIN issues ON projects.id=issues.project_id \
WHERE assigned_to_id IS NULL AND projects.status = 1 \
AND issues.status_id != 5" > issues_per.project1
sed 1d issues_per.project1 > issues_per.project2
sed 's/^/https:\/\/domain.com\/issues\//' issues_per.project2 > issues_per.project_link
mutt -s "The list of issues without assignee for $NOW" -- user@domain.com < issues_per.project_link
Результирующий файл выглядит так:
# cat issues_per.project_link
https://domain.com/issues/18	 Project1 (description)
https://domain.com/issues/429	 Project2 ...
https://domain.com/issues/430	 Project2 ...
https://domain.com/issues/500	 Project3 ...
https://domain.com/issues/501	 Project3
https://domain.com/issues/695	 Project4
https://domain.com/issues/696	 Project4
https://domain.com/issues/698	 Project4
...
Надо сделать чтоб выглядел так:
Project1 (description)

https://domain.com/issues/18	 

Project2 ...

https://domain.com/issues/429	 
https://domain.com/issues/430

Project3 ...
	 
https://domain.com/issues/500	 
https://domain.com/issues/501	 

Project4

https://domain.com/issues/695	 
https://domain.com/issues/696	 
https://domain.com/issues/698	 
...

★★

Т.е. надо сделать GROUP BY project? На шелле это если сделать и можно, то явно сложнее чем на SQL. Короче, я бы тут всё на SQL-е сделал, даже замену URL-на пустую строчку, тоже можно в SQL сделать.

php-coder ★★★★★
()
Ответ на: комментарий от php-coder

Чтобы не быть голословным, вот моё решение:

$ cat t
https://domain.com/issues/501|Project3 (desc of Project3)
https://domain.com/issues/695|Project4 (desc of Project4)
https://domain.com/issues/18|Project1 (desc of Project1)
https://domain.com/issues/13|Project2 (desc of Project2)
https://domain.com/issues/500|Project3 (desc of Project3)
https://domain.com/issues/696|Project4 (desc of Project4)
https://domain.com/issues/22|Project2 (desc of Project2)
https://domain.com/issues/698|Project4 (desc of Project4)

$ sort -t'|' -k2 -u t | while IFS="|" read TASK PROJ; do printf "$PROJ\n%s\n\n" "$(fgrep "$PROJ" t | cut -d'|' -f1)"; done
Project1 (desc of Project1)
https://domain.com/issues/18

Project2 (desc of Project2)
https://domain.com/issues/13
https://domain.com/issues/22

Project3 (desc of Project3)
https://domain.com/issues/501
https://domain.com/issues/500

Project4 (desc of Project4)
https://domain.com/issues/695
https://domain.com/issues/696
https://domain.com/issues/698

$

Но вам понадобится модифицировать вывод SQL, чтобы он разделял записи с помощью pipe (я бы использовать CONCAT_WS() для этого).

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

(P.S. В чем тут идея: сначала получить список уникальных ключей, в нашем случае это названия проектов. Затем мы проходимся по каждому проекту и для него находим все issues. Тут некрасиво то, что файл читается N+1 раз, где N это число проектов. Думаю, что на баше можно как-нибудь это решить красиво с помощью массивов, но в них я не силен.)

php-coder ★★★★★
()
Последнее исправление: php-coder (всего исправлений: 1)

У redmine есть rest api. Лазить за данными в базу - крайне плохая идея, как минимум поддерживать это при обновлении редмайна сложнее.

ventilator ★★★
()
Ответ на: комментарий от php-coder

спасибо за это:

$ sort -t'|' -k2 -u t | \
    while IFS="|" read TASK PROJ; do \
      printf "$PROJ\n%s\n\n" "$(fgrep "$PROJ" t | \ 
      cut -d'|' -f1)"; \
    done 
если вас не затруднит, прокомментируйте пожалуйста этот код подробней чтоб было понятно новичку что за чем следует и что происходит.

nerve ★★
() автор топика
Ответ на: комментарий от thesis

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

nerve ★★
() автор топика

можно выполнить такой скрипт$ sed -r 's~(\S+)\s+(.*)~echo "\1" >>"d/\2"~pe' t.txt echo "https://domain.com/issues/18" >>"d/Project1 (description)" echo "https://domain.com/issues/429" >>"d/Project2 ..." echo "https://domain.com/issues/430" >>"d/Project2 ..." echo "https://domain.com/issues/500" >>"d/Project3 ..." echo "https://domain.com/issues/501" >>"d/Project3" echo "https://domain.com/issues/695" >>"d/Project4" echo "https://domain.com/issues/696" >>"d/Project4" echo "https://domain.com/issues/698" >>"d/Project4" он создаст кучу файлов в d/, которые потом можно слить вместе.

drBatty ★★
()
Ответ на: комментарий от nerve

если вас не затруднит, прокомментируйте пожалуйста этот код подробней чтоб было понятно новичку что за чем следует и что происходит.

тут сортировка по второму столбику.

drBatty ★★
()
Ответ на: комментарий от nerve

если вас не затруднит, прокомментируйте пожалуйста этот код подробней чтоб было понятно новичку что за чем следует и что происходит.

Я попытался идею описать в своём ответе, а тонкости реализации оставил вам. Если вы поиграетесь с этим кодом и почитаете ман по ключам и командам, то уверен, что сможете разобраться самостоятельно.

Начните с простого и затем добавлятей команды/ключи:

$ cat t # отобразит содержимое файла
$ sort t # отсортирует по умолчанию
$ sort t -t'|' -k2 # отсортирует по второму полю, где поля разделяются pipe-ом
$ sort t -t'|' -k2 -u # тоже что и выше, но оставит только уникальные значения
$ sort -t'|' -k2 -u t | while IFS="|" read TASK PROJ; do echo $PROJ; done # из списка с уникальными проектами, считает название проекта в переменную PROJ и номер задачи в TASK (которая не используется)
$ fgrep 'Project3 (desc of Project3)' t # ищет все записи для указанного проекта
$ fgrep 'Project3 (desc of Project3)' t | cut -d'|' -f1 # тоже что и выше, но отсеивает название проекта, оставляя только ссылку
php-coder ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.