(process-command {
  :connection conn
  :operation :merge
  :into "bob_test"
  :field-list [{:field-name "id" :set-to "?"}
               {:field-name "first_name" :set-to "?"}
               {:field-name "last_name" :set-to "?"}]
  :replacement-values [{:type :long :value 1}
                       {:type :string :value "Bob"}
                       {:type :string :value "Roth"}]})

insert into tag__tag_group
(group_name, question_id, created_by, updated_by, status, single_tagging, tag__tag_group.order)
select "", -999, 1, 1, 0, 0, (IFNULL(MAX(tg2.order), 0) + 1)
                        from tag__tag_group tg2
                        where tg2.question_id = -27533
                              and tg2.status <> 3;

(process-command {
  :operation :insert-from-select
  :into "tag__tag_group"
  :field-list ["group_name"
               "question_id"
               "created_by"
               "updated_by"
               "status"
               "single_tagging"
               "tag__tag_group.order"]
  :insert-select {
    :from "tag__tag_group tg2"
    :field-list ["\"\""
                 "-999"
                 "1"
                 "1"
                 "0"
                 "0"
                 "(coalesce(max(tg2.order),0))+1"]
    :where [{:and {:left "tg2.question_id" :comparison "=" :right "-27533"}
                  {:left "tg2.status" :comparison "<>" :right "3"}}]}})

update tag__tag_group tg1 inner join tag__tag_group tg2 ON (tg1.question_id = tg2.question_id)
set tg1.group_name = 'x',
    tg1.updated_by = 1,
    tg1.status = 3,
    tg1.single_tagging = 1,
    tg1.order = tg1.order + -1,
    tg2.order = tg2.order - -1
where tg1.group_id = 11718
  and tg1.status <> -1
        and tg2.group_id <> 11718
        and tg2.question_id = 27504
        and tg2.order = tg1.order + -1
  and tg2.status <> -1;


(process-command {
  :connection conn               
  :operation :update-multi
  :into [{:table-alias "tg1" :table-name "tag__tag_group"}
         {:table-alias "tg2" :table-name "tag__tag_group" :join-type :inner-join :join-clause "tg1.question_id = tg2.question_id"}]
  :field-list [{:table-alias "tg1" :field-name "group_name" :set-to "'x'"}
               {:table-alias "tg1" :field-name "updated_by" :set-to "1"}
               {:table-alias "tg1" :field-name "status" :set-to "3"}
               {:table-alias "tg1" :field-name "single_tagging" :set-to "1"}
               {:table-alias "tg1" :field-name "order" :set-to "tg1.order - 1"}
               {:table-alias "tg2" :field-name "order" :set-to "tg2.order + 1"}]
  :where {:and [{:left "tg1.group_id" :comparison "=" :right "11718"}
                {:left "tg1.status" :comparison "<>" :right "-1"}
                {:left "tg2.group_id" :comparison "<>" :right "11718"}
                {:left "tg2.question_id" :comparison "=" :right "27504"}
                {:left "tg2.order" :comparison "=" :right "tg1.order - 1"}
                {:left "tg2.status" :comparison "<>" :right "-1"}]}
  })

(process-update-multi-command {
    :from-clause [{:table-alias "tg1" :table-name "tag__tag_group"}
                  {:table-alias "tg2" :table-name "tag__tag_group" :join-type :inner-join :join-clause "tg1.question_id = tg2.question_id"}]
  :field-clause [{:table-alias "tg1" :field-name "group_name" :set-to "'x'"}
                 {:table-alias "tg1" :field-name "updated_by" :set-to "1"}
                 {:table-alias "tg1" :field-name "status" :set-to "3"}
                 {:table-alias "tg1" :field-name "single_tagging" :set-to "1"}
                 {:table-alias "tg1" :field-name "order" :set-to "tg1.order - 1"}
                 {:table-alias "tg2" :field-name "order" :set-to "tg2.order + 1"}]
  :where-clause {:and [{:left "tg1.group_id" :comparison "=" :right "11718"}
                       {:left "tg1.status" :comparison "<>" :right "-1"}
                       {:left "tg2.group_id" :comparison "<>" :right "11718"}
                       {:left "tg2.question_id" :comparison "=" :right "27504"}
                       {:left "tg2.order" :comparison "=" :right "tg1.order - 1"}
                       {:left "tg2.status" :comparison "<>" :right "-1"}]}
})


select tg1.group_id, tg2.question_id, tg1.`order`, tg1.group_name, tg1.updated_by, tg1.status,
       tg2.`order` AS order_asc, tg2.order * - 1 AS order_desc from tag__tag_group tg1
  left JOIN tag__tag_group tg2
    ON (tg2.question_id = tg1.question_id
          AND tg2.group_id <> tg1.group_id)
    AND tg2.order
            BETWEEN (CASE WHEN ? = 0 THEN null
                          WHEN ? = 1 THEN tg1.order + 1
                          WHEN ? = -1 THEN 0 END)
            AND (CASE WHEN ? = 0 THEN null
                            WHEN ? = 1 THEN ~0
                            WHEN ? = -1 THEN tg1.order - 1 END)
WHERE tg1.group_id = 11718
ORDER BY (tg2.order * -1)
LIMIT 1;


select
  tg1.*, tg
from tag__tag_group tg1
left outer join tag__tag_group tgh
on tgh.question_id = tg1.question_id
and tgh.group_id <> tg1.group_id
and tgh.`order` > tg1.`order`
where tg1.group_id = 11718
having row_number() over (order by tgh.`order`) = 1

cross join (
select min(order) as thenum from tag__tag_group tgh
where tgh.question_id = tg1.question_id
and tgh.group_id <> tg1.group_id
and tgh.order > tg1.order
)
tghigher
cross join (
select max(order) as thenum from tag__tag_group tgl
where tgl.question_id = tg1.question_id
and tgl.group_id <> tg1.group_id
and tgl.order < tg1.order
)
tglower

left outer join tag__tag_group tg2
on tg2.question_id = tg1.question_id
and tg2.group_id <> tg1.group_id
and tg2.order = (case ? when 0 then null
                        when 1 then tghigher.thenum
                        when -1 then tglower.thenum
                 end)
WHERE tg1.group_id = 11718

