I've fixed it by manually giving field names. However it returns empty.
WITH RECURSIVE "pattern" ( "pattern" ) AS (
SELECT
string_to_array( 'folder_2/SUB iso', '/' )),
"full_paths" AS (
SELECT
"id",
"base_folder_id",
"subject",
1 AS "idx"
FROM
"folders"
CROSS JOIN "pattern"
WHERE
((
"user_id" = 24
)
AND ( "subject" ILIKE "pattern" [ 1 ] )) UNION ALL
(
SELECT
"x"."id",
"x"."base_folder_id",
"x"."subject",
( "idx" + 1 )
FROM
"folders" AS "x"
CROSS JOIN "pattern"
INNER JOIN "full_paths" AS "y" ON ((
"y"."id" = "y"."base_folder_id"
)
AND ( "x"."subject" ILIKE "pattern" [ ( "idx" + 1 ) ] )))) SELECT
"id",
"subject"
FROM
"full_paths"
CROSS JOIN "pattern"
WHERE
(
"idx" = CARDINALITY ( "pattern" ))
On Thursday, October 11, 2018 at 10:49:55 PM UTC+3, genc wrote:
>
> Hi Jeremy,
>
> Thank you so much!!!
>
>
> However, Unfortunately given example produces an error and says:
>
>
> > ERROR: column pattern.base_folder_id does not exist
>
> LINE 1: ...n" INNER JOIN "full_paths" AS "y" ON (("y"."id" = "pattern
> "....
>
>
> I think In your query, :pattern matched with :y instead of :x with :y when
> inner join created. I tried to manually fix it but unable to do so.
>
> Thanks,
> Gencer.
>
>
>
> On Thursday, October 11, 2018 at 10:34:12 PM UTC+3, Jeremy Evans wrote:
>>
>> On Thursday, October 11, 2018 at 11:31:06 AM UTC-7, genc wrote:
>>>
>>> Hi,
>>>
>>> I'm sorry my previous email was mistakenly wrong. This is the correct
>>> one. I mixed up the queries.
>>>
>>>
>>> with recursive pattern(pattern) as (
>>> select string_to_array('folder_2/SUB iso', '/') -- input
>>> ),
>>> full_paths as (
>>> select id, base_folder_id, subject, 1 as idx
>>> from folders
>>> cross join pattern
>>> where user_id = 24 and subject ILIKE pattern[1]
>>> union all
>>> select x.id, x.base_folder_id, x.subject, idx+ 1
>>> from folders as x
>>> cross join pattern
>>> inner join full_paths as y
>>> on x.base_folder_id = y.id
>>> and x.subject ILIKE pattern[idx+ 1]
>>> )
>>> select id, subject
>>> from full_paths
>>> cross join pattern
>>> where idx = cardinality(pattern)
>>>
>>>
>>> I couldn't transform this to Sequel properly. Is there any way to do
>>> this or should do a function?
>>>
>>
>> You can do this with Sequel:
>>
>> DB[:full_paths].
>> select(:id, :subject).
>> cross_join(:pattern).
>> where{{:idx=>cardinality(:pattern)}}.
>> with(:pattern, DB.select{string_to_array("folder_2/SUB iso", '/')},
>> :args=>[:pattern]).
>> with_recursive(:full_paths,
>> DB[:folders].
>> select(:id, :base_folder_id, :subject, Sequel[1].as(:idx)).
>> cross_join(:pattern).
>> where(:user_id=>24).
>> where{subject.ilike(pattern.sql_subscript(1))},
>> DB[Sequel[:folders].as(:x)].
>> select(:id, :base_folder_id, :subject, Sequel[:idx] + 1).
>> cross_join(:pattern).
>> join(Sequel[:full_paths].as(:y),
>> :id=>:base_folder_id){Sequel.expr{x[:subject].ilike(pattern.sql_subscript(idx+1))}}
>> )
>>
>> WITH RECURSIVE "pattern"("pattern") AS (
>> SELECT string_to_array('folder_2/SUB iso', '/')
>> ),
>> "full_paths" AS (
>> SELECT "id", "base_folder_id", "subject", 1 AS "idx"
>> FROM "folders"
>> CROSS JOIN "pattern"
>> WHERE (("user_id" = 24) AND ("subject" ILIKE "pattern"[1] ESCAPE '\'))
>> UNION ALL (
>> SELECT "id", "base_folder_id", "subject", ("idx" + 1)
>> FROM "folders" AS "x"
>> CROSS JOIN "pattern"
>> INNER JOIN "full_paths" AS "y"
>> ON (("y"."id" = "pattern"."base_folder_id")
>> AND ("x"."subject" ILIKE "pattern"[("idx" + 1)] ESCAPE '\')))
>> )
>> SELECT "id", "subject"
>> FROM "full_paths"
>> CROSS JOIN "pattern"
>> WHERE ("idx" = cardinality("pattern"))
>>
>> Thanks,
>> Jeremy
>>
>
--
You received this message because you are subscribed to the Google Groups
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.