[MarkLogic Dev General] Unexpected token syntax error, unexpected Vbar_

Rob Szkutak rob.szkutak at marklogic.com
Wed Jan 6 05:00:46 PST 2016


Well, there are some caveats to that. For example, $set would need to be either a cts:search expression or fully searchable XPath expression. You won't get the optimization at all if it is referenced via a variable. https://docs.marklogic.com/guide/performance/order_by#id_59622 ("The search or XPath expression must be part of the FLWOR, not bound to a variable that is referenced in the FLWOR.")

So based on what I'm seeing in his shared code that optimization won't be made. ("for $output in $outputs")

My rationale behind the recommendation was that it would be easier to debug and less prone to injection than a massive xdmp:value with multiple xdmp:value therein. I think that also ends up being worse for performance when you have multiple layers of xdmp:value?

I do suspect the whole thing could be refactored as a cts:search expression including a cts:index-order and then the results iterated through to do his transform. That would be the best thing :)

Best,
Rob

Rob Szkutak
Associate Consultant
MarkLogic Corporation
rob.szkutak at marklogic.com
Cell +1.716.562.8464
www.marklogic.com<http://www.marklogic.com>

________________________________
From: general-bounces at developer.marklogic.com [general-bounces at developer.marklogic.com] on behalf of Geert Josten [Geert.Josten at marklogic.com]
Sent: Wednesday, January 06, 2016 6:26 AM
To: MarkLogic Developer Discussion
Subject: Re: [MarkLogic Dev General] Unexpected token syntax error, unexpected Vbar_

Doing an if inside the order by (good suggestion by the way) would be most useful if you can eliminate the need for xdmp:value entirely. Doing xdmp:value inside the order by sounds worse to me than doing it for the entire flwor statement. If you do it for the entire flwor statement, static analysis might be able to leverage indexes to speed up sorting..

Cheers,
Geert

From: <general-bounces at developer.marklogic.com<mailto:general-bounces at developer.marklogic.com>> on behalf of Rob Szkutak <rob.szkutak at marklogic.com<mailto:rob.szkutak at marklogic.com>>
Reply-To: MarkLogic Developer Discussion <general at developer.marklogic.com<mailto:general at developer.marklogic.com>>
Date: Wednesday, January 6, 2016 at 1:21 PM
To: MarkLogic Developer Discussion <general at developer.marklogic.com<mailto:general at developer.marklogic.com>>
Subject: Re: [MarkLogic Dev General] Unexpected token syntax error, unexpected Vbar_

Couple of thoughts:

1) You're not sharing your full code ($outputs and $aliases are not defined, for instance) . Any chance the error is in something not shown?

2) Have you checked the query you're passing into xdmp:value() to make sure there isn't an error in that?

Looking at your code I see this:


3) You have another syntax error at the bottom of your code. No $ before return $results. So there's no way this would run on either Windows or Linux ;-)

4) I wouldn't really recommend writing a query this way just to dynamically build an order by. I'd encourage you to use syntax like this instead (I'm using your variable names but you may still need to refactor this further):

for $each in $set
if($sort = 'ascending' and $sortOrder != '') then order by xdmp:value(fn:concat("$doc","//", $element) ascending
else if($sort = 'descending' and $sortOrder != '') then order by xdmp:value(fn:concat("$doc","//", $element) descending


Rob Szkutak
Associate Consultant
MarkLogic Corporation
rob.szkutak at marklogic.com<mailto:rob.szkutak at marklogic.com>
Cell +1.716.562.8464
www.marklogic.com<http://www.marklogic.com>

________________________________
From: general-bounces at developer.marklogic.com<mailto:general-bounces at developer.marklogic.com> [general-bounces at developer.marklogic.com<mailto:general-bounces at developer.marklogic.com>] on behalf of Geert Josten [Geert.Josten at marklogic.com<mailto:Geert.Josten at marklogic.com>]
Sent: Wednesday, January 06, 2016 5:01 AM
To: MarkLogic Developer Discussion
Subject: Re: [MarkLogic Dev General] Unexpected token syntax error, unexpected Vbar_

Hi Pragya,

It surprises me that this doesn’t error on Windows. The line that you marked ends with ||, but from the looks of it, there is no following string operand that I would expect. Try removing it..

Cheers,
Geert

From: <general-bounces at developer.marklogic.com<mailto:general-bounces at developer.marklogic.com>> on behalf of "Kapoor, Pragya" <PKapoor1 at innodata.com<mailto:PKapoor1 at innodata.com>>
Reply-To: MarkLogic Developer Discussion <general at developer.marklogic.com<mailto:general at developer.marklogic.com>>
Date: Wednesday, January 6, 2016 at 9:57 AM
To: MarkLogic Developer Discussion <general at developer.marklogic.com<mailto:general at developer.marklogic.com>>
Subject: [MarkLogic Dev General] Unexpected token syntax error, unexpected Vbar_

Hi,

Below code is working fine on windows server, but on linux server its giving the error.

XDMP-UNEXPECTED: (err:XPST0003) Unexpected token syntax error, unexpected Vbar_

 let $sort as xs:string := string-join(
for $output in $outputs
let $sortOrder := $output//sort/text()
return
(if($sortOrder != '') then
let $element :=
let $path:= $output/path
let $ns := $path/@ns
let $path := fn:tokenize($path,"/")
let $elem := fn:concat($ns,":",$path[fn:last()],"[1]")
let $elemParent := fn:concat($ns,":",$path[fn:last()-1],"[1]")
return fn:concat($elemParent,"/",$elem)
return fn:concat("$doc","//", $element," ",$sortOrder)
else ()),", ")

  let $results :=
'element report {
element columns {
for $alias in $aliases
return element title {$alias}},
element results {
for $docId in $docUris
let $doc := fn:doc($docId)
let $tempResult :=
element result {
for $output in $outputs
let $element :=
let $path:= $output/path
let $elem := fn:tokenize($path,"/")[fn:last()]
let $ns := $path/@ns
return fn:concat($ns,":",$elem)


let $functions := if($output/functions) then fn:data($output/functions) else ()
let $type :=  if($output/functions) then fn:data($output/functions/@type) else ()
let $alias := fn:data($output/columnAlias)
let $result := $doc//*[name() = $element]/text()

let $result :=
if($type eq "string") then
let $exp := fn:replace($functions,$alias,fn:concat("&apos;",$result,"&apos;"))
return xdmp:value($exp)
else
  (:let $exp := (fn:replace($functions,$alias,$result[1])):)
   (:xdmp:value("$exp"):) $result
return
if($cartesianFlag eq "false") then
element {$alias} {fn:string-join($result,";")}
else
let $resultCount := fn:count($result)
return
if($resultCount > 1 ) then for $i in $result return  element {$alias} { ($i) }
else
  element {$alias} { ($result) }
}' ||  (if($sort != '') then fn:concat("order by ",$sort) else ()) || (: error on this line:)
' return
if($cartesianFlag eq "false") then
$tempResult
else
for $result in $tempResult
let $_ := xdmp:set($qt, "")
return local:transform-into-result($result)
}
}'
let $results :=  xdmp:value($results)
               return results

Thanks
Pragya


"This e-mail and any attachments transmitted with it are for the sole use of the intended recipient(s) and may contain confidential , proprietary or privileged information. If you are not the intended recipient, please contact the sender by reply e-mail and destroy all copies of the original message. Any unauthorized review, use, disclosure, dissemination, forwarding, printing or copying of this e-mail or any action taken in reliance on this e-mail is strictly prohibited and may be unlawful."
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://developer.marklogic.com/pipermail/general/attachments/20160106/8b4bfb90/attachment.html 


More information about the General mailing list