In 6.5 EE Use OLAP window frames
Getting n documents before n after easy
SELECT d.docs
FROM (SELECT b.name, ARRAY_AGG(b) OVER (ORDER BY b.name ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS docs
FROM bucket1 AS b WHERE b.name IS NOT NULL) AS d
WHERE d.name = "option 6";
Always give 5 entires if found entry (2 before/2 after, on ends next or prev one), none if not found
SELECT d1.docs[startpos:endpos] AS docs
FROM (SELECT d.docs, d.noffset, d.name
FROM ( SELECT b.name, ARRAY_AGG(b) OVER (ORDER BY b.name ROWS BETWEEN 2*2 PRECEDING AND 2*2 FOLLOWING) AS docs, 2 AS noffset
FROM bucket1 AS b WHERE b.name IS NOT NULL) AS d
WHERE d.name = "option 6") AS d1
LET foundpos = (FIRST pos FOR pos:v IN d1.docs WHEN v.name == d1.name END),
startpos = GREATEST(0, foundpos - (d1.noffset + GREATEST (0, d1.noffset - (ARRAY_LENGTH(d1.docs) -1 - foundpos)))),
endpos = LEAST(ARRAY_LENGTH(d1.docs), startpos+2*d1.noffset+1);
pre 6.5
SELECT n.*
FROM ( SELECT snames[startpos:endpos] AS snames
FROM (SELECT (FIRST pos FOR pos:v IN snames WHEN v.name == "option 6" END) AS foundpos,
2 AS noffset,
snames
LET snames = (SELECT n.* FROM bucket1 AS n WHERE n.name IS NOT NULL ORDER BY n.name)) AS d
LET startpos = GREATEST(0, d.foundpos - (d.noffset + GREATEST (0, d.noffset - (ARRAY_LENGTH(d.snames) -1 - d.foundpos)))),
endpos = LEAST(ARRAY_LENGTH(d.snames), startpos+2*d.noffset+1)
) AS d2 UNNEST d2.snames AS n;
OR
WITH searchdoclist AS ( (WITH docs AS (SELECT b.name, ARRAY_AGG(b) OVER (ORDER BY b.name ROWS BETWEEN 2*2 PRECEDING AND 2 FOLLOWING) AS docs
FROM bucket1 AS b WHERE b.name IS NOT NULL)
SELECT (SELECT RAW sd FROM d.docs AS sd ORDER BY sd.name DESC LIMIT 5) AS docs
FROM docs AS d
WHERE d.name = "option 8" LIMIT 1)[0])
SELECT n.*
FROM searchdoclist.docs AS n
ORDER BY n.name;