Skip to content
This repository has been archived by the owner on Nov 10, 2022. It is now read-only.

Commit

Permalink
• Changed the URL structure of the key/value queries
Browse files Browse the repository at this point in the history
• Renamed returnPath to extractPath
• Included extractPath in all endpoints that return documents (kvquery, query, customquery and store)
• Included applyTransform in all endpoints that return documents
  • Loading branch information
ryangrimm committed Aug 13, 2011
1 parent f224497 commit ebbb97a
Show file tree
Hide file tree
Showing 11 changed files with 174 additions and 138 deletions.
47 changes: 32 additions & 15 deletions config/endpoints.xqy
Expand Up @@ -14,7 +14,11 @@ declare variable $endpoints:ENDPOINTS as element(rest:options) :=
<request uri="^/(json|xml)/store(/.+)$" endpoint="/data/store.xqy" user-params="allow">
<uri-param name="content-type">$1</uri-param>
<uri-param name="uri" as="string">$2</uri-param>
<http method="GET"/>
<http method="GET">
<param name="extractPath" required="false"/>
<param name="applyTransform" required="false"/>
<param name="include" repeatable="true" required="false" default="content"/>
</http>
<http method="POST"/>
<http method="PUT"/>
<http method="DELETE"/>
Expand All @@ -23,11 +27,12 @@ declare variable $endpoints:ENDPOINTS as element(rest:options) :=
<!-- Custom queries -->
<request uri="^/(json|xml)/customquery(/)?$" endpoint="/data/customquery.xqy">
<uri-param name="content-type">$1</uri-param>
<param name="q" required="true"/>
<param name="start" required="false"/>
<param name="end" required="false"/>
<param name="include" repeatable="true" required="false"/>
<param name="returnpath" required="false"/>
<param name="q" required="true" default="{}"/>
<param name="start" required="false" as="positiveInteger" default="1"/>
<param name="end" required="false" as="positiveInteger"/>
<param name="include" repeatable="true" required="false" default="content"/>
<param name="extractPath" required="false"/>
<param name="applyTransform" required="false"/>
<http method="GET"/>
<http method="POST"/>
</request>
Expand All @@ -39,19 +44,31 @@ declare variable $endpoints:ENDPOINTS as element(rest:options) :=
<param name="start" required="false" as="positiveInteger" default="1"/>
<param name="end" required="false" as="positiveInteger"/>
<param name="include" repeatable="true" required="false" default="content"/>
<param name="returnpath" required="false"/>
<param name="extractPath" required="false"/>
<param name="applyTransform" required="false"/>
</request>

<!-- Key value queryies -->
<request uri="^/json/kvquery(/|/(\d+)/?|/(\d+)/(\d+)/?)?$" endpoint="/data/jsonkvquery.xqy" user-params="allow">
<uri-param name="__MLJSONURL__:index">$2</uri-param>
<uri-param name="__MLJSONURL__:start">$3</uri-param>
<uri-param name="__MLJSONURL__:end">$4</uri-param>
<request uri="^/json/kvquery$" endpoint="/data/jsonkvquery.xqy">
<param name="key" required="false"/>
<param name="element" required="false"/>
<param name="attribute" required="false"/>
<param name="value" required="false"/>
<param name="start" required="false" as="positiveInteger" default="1"/>
<param name="end" required="false" as="positiveInteger"/>
<param name="include" repeatable="true" required="false" default="content"/>
<param name="extractPath" required="false"/>
<param name="applyTransform" required="false"/>
</request>
<request uri="^/xml/kvquery(/|/(\d+)/?|/(\d+)/(\d+)/?)?$" endpoint="/data/xmlkvquery.xqy" user-params="allow">
<uri-param name="__MLJSONURL__:index">$2</uri-param>
<uri-param name="__MLJSONURL__:start">$3</uri-param>
<uri-param name="__MLJSONURL__:end">$4</uri-param>
<request uri="^/xml/kvquery$" endpoint="/data/xmlkvquery.xqy">
<param name="element" required="false"/>
<param name="attribute" required="false"/>
<param name="value" required="false"/>
<param name="start" required="false" as="positiveInteger" default="1"/>
<param name="end" required="false" as="positiveInteger"/>
<param name="include" repeatable="true" required="false" default="content"/>
<param name="extractPath" required="false"/>
<param name="applyTransform" required="false"/>
</request>

<!-- Info request -->
Expand Down
25 changes: 14 additions & 11 deletions data/customquery.xqy
Expand Up @@ -19,29 +19,32 @@ xquery version "1.0-ml";
import module namespace customquery="http://marklogic.com/mljson/custom-query" at "lib/custom-query.xqy";
import module namespace json="http://marklogic.com/json" at "lib/json.xqy";

import module namespace rest="http://marklogic.com/appservices/rest" at "lib/rest/rest.xqy";
import module namespace endpoints="http://marklogic.com/mljson/endpoints" at "/config/endpoints.xqy";

declare option xdmp:mapping "false";

let $params := rest:process-request(endpoints:request("/data/query.xqy"))

let $requestMethod := xdmp:get-request-method()
let $include := xdmp:get-request-field("include", "content")
let $contentType := xdmp:get-request-field("content-type")[1]
let $start := xdmp:get-request-field("start")[1]
let $end := xdmp:get-request-field("end")[1]
let $returnPath := xdmp:get-request-field("returnpath")[1]
let $query := string(xdmp:get-request-field("q", "{}")[1])
let $include := map:get($params, "include")
let $contentType := map:get($params, "content-type")
let $start := map:get($params, "start")
let $end := map:get($params, "end")
let $extractPath := map:get($params, "extractPath")
let $applyTransform := map:get($params, "applyTransform")
let $query := string(map:get($params, "q"))
let $query :=
if(string-length(normalize-space($query)) = 0)
then "{}"
else $query

let $start := if($start castable as xs:positiveInteger) then xs:positiveInteger($start) else 1
let $end := if($end castable as xs:positiveInteger) then xs:positiveInteger($end) else ()

return
if($requestMethod = ("GET", "POST"))
then
if($contentType = "json")
then customquery:searchJSON($query, $include, $start, $end, $returnPath)
then customquery:searchJSON($query, $include, $start, $end, $extractPath, $applyTransform)
else if($contentType = "xml")
then customquery:searchXML($query, $include, $start, $end, $returnPath)
then customquery:searchXML($query, $include, $start, $end, $extractPath, $applyTransform)
else ()
else ()
58 changes: 28 additions & 30 deletions data/jsonkvquery.xqy
Expand Up @@ -22,48 +22,46 @@ import module namespace reststore="http://marklogic.com/reststore" at "lib/rests
import module namespace json="http://marklogic.com/json" at "lib/json.xqy";
import module namespace dateparser="http://marklogic.com/dateparser" at "lib/date-parser.xqy";

import module namespace rest="http://marklogic.com/appservices/rest" at "lib/rest/rest.xqy";
import module namespace endpoints="http://marklogic.com/mljson/endpoints" at "/config/endpoints.xqy";

declare option xdmp:mapping "false";

let $index := xdmp:get-request-field("__MLJSONURL__:index")
let $index :=
if($index castable as xs:integer)
then xs:integer($index)
else 1
let $params := rest:process-request(endpoints:request("/data/jsonkvquery.xqy"))

let $start := xdmp:get-request-field("__MLJSONURL__:start")
let $start :=
if($start castable as xs:integer)
then xs:integer($start)
else $index
let $key := map:get($params, "key")
let $element := map:get($params, "element")
let $attribute := map:get($params, "attribute")
let $value := map:get($params, "value")

let $end := xdmp:get-request-field("__MLJSONURL__:end")
let $end :=
if($end castable as xs:integer)
then xs:integer($end)
else $start

let $query := cts:and-query(
for $key in xdmp:get-request-field-names()
let $value := xdmp:get-request-field($key)
let $castAs := json:castAs($key, true())
where not(starts-with($key, "__MLJSONURL__:"))
return
if($castAs = "date")
let $start := map:get($params, "start")
let $end := map:get($params, "end")
let $include := map:get($params, "include")
let $extractPath := map:get($params, "extractPath")

let $query :=
if(exists($key))
then
if(json:castAs($key, true()) = "date")
then
let $date := dateparser:parse($value)
return
if(empty($date))
then cts:element-value-query(xs:QName(concat("json:", json:escapeNCName($key))), $value)
else cts:element-attribute-value-query(xs:QName(concat("json:", json:escapeNCName($key))), xs:QName("normalized-date"), $date)
then cts:element-value-query(xs:QName(concat("json:", json:escapeNCName($key))), $value, "exact")
else cts:element-attribute-value-query(xs:QName(concat("json:", json:escapeNCName($key))), xs:QName("normalized-date"), $date, "exact")

else if($value = ("true", "false"))
then cts:or-query((
cts:element-value-query(xs:QName(concat("json:", json:escapeNCName($key))), $value),
cts:element-attribute-value-query(xs:QName(concat("json:", json:escapeNCName($key))), xs:QName("boolean"), $value)
cts:element-value-query(xs:QName(concat("json:", json:escapeNCName($key))), $value, "exact"),
cts:element-attribute-value-query(xs:QName(concat("json:", json:escapeNCName($key))), xs:QName("boolean"), $value, "exact")
))

else cts:element-value-query(xs:QName(concat("json:", json:escapeNCName($key))), $value)
)
else cts:element-value-query(xs:QName(concat("json:", json:escapeNCName($key))), $value, "exact")
else if(exists($element) and exists($attribute))
then cts:element-attribute-value-query(xs:QName($element), xs:QName($attribute), $value, "exact")
else if(exists($element))
then cts:element-value-query(xs:QName($element), $value, "exact")
else ()

let $results :=
if(exists($start) and exists($end) and $end > $start)
Expand All @@ -82,4 +80,4 @@ let $end :=
then $total
else $end

return reststore:outputMultipleJSONDocs($results, $start, $end, $total, ("content"), $query, ())
return reststore:outputMultipleJSONDocs($results, $start, $end, $total, $include, $query, $extractPath, ())
10 changes: 6 additions & 4 deletions data/lib/custom-query.xqy
Expand Up @@ -49,7 +49,8 @@ declare function customquery:searchJSON(
$include as xs:string*,
$start as xs:positiveInteger?,
$end as xs:positiveInteger?,
$returnPath as xs:string?
$extractPath as xs:string?,
$applyTransform as xs:string?
) as xs:string
{
let $start := if(empty($start)) then 1 else $start
Expand Down Expand Up @@ -79,15 +80,16 @@ declare function customquery:searchJSON(
then $total
else $end

return reststore:outputMultipleJSONDocs($results, $start, $end, $total, $include, $cts, $returnPath)
return reststore:outputMultipleJSONDocs($results, $start, $end, $total, $include, $cts, $extractPath, $applyTransform)
};

declare function customquery:searchXML(
$json as xs:string,
$include as xs:string*,
$start as xs:positiveInteger?,
$end as xs:positiveInteger?,
$returnPath as xs:string?
$extractPath as xs:string?,
$applyTransform as xs:string?
) as element(response)
{
let $start := if(empty($start)) then 1 else $start
Expand Down Expand Up @@ -117,7 +119,7 @@ declare function customquery:searchXML(
then $total
else $end

return reststore:outputMultipleXMLDocs($results, $start, $end, $total, $include, $cts, $returnPath)
return reststore:outputMultipleXMLDocs($results, $start, $end, $total, $include, $cts, $extractPath, $applyTransform)
};

declare function customquery:getParseTree(
Expand Down
3 changes: 3 additions & 0 deletions data/lib/json.xqy
Expand Up @@ -335,6 +335,9 @@ declare private function json:untypedToJSONType(
else if($value instance of xs:string)
then (attribute type { "string" }, string($value))

else if($value instance of document-node() and exists($value/json:json))
then $value/json:json/(@*, node())

else (attribute type { "string" }, xdmp:quote($value))
else attribute type { "null" }
}</json:item>
Expand Down
5 changes: 3 additions & 2 deletions data/lib/query-parser.xqy
Expand Up @@ -261,7 +261,7 @@ declare private function parser:wordQuery(
let $query :=
for $item in config:getContentItems()
return
if($type/@mode = "contains")
if($item/@mode = "contains")
then
if($item/@type = "key")
then cts:element-word-query(xs:QName(concat("json:", $item)), string($term), ("punctuation-insensitive", "whitespace-insensitive"), $item/@weight)
Expand All @@ -272,7 +272,7 @@ declare private function parser:wordQuery(
else if($item/@type = "field")
then cts:field-word-query($item, string($term), ("punctuation-insensitive", "whitespace-insensitive"), $item/@weight)
else ()
else if($type/@mode = "equals")
else if($item/@mode = "equals")
then
if($item/@type = "key")
then cts:element-value-query(xs:QName(concat("json:", $item)), string($term), ("punctuation-insensitive", "whitespace-insensitive"), $item/@weight)
Expand All @@ -283,6 +283,7 @@ declare private function parser:wordQuery(
else if($item/@type = "field")
then xdmp:apply(xdmp:function("cts:field-value-query"), $item, string($term), ("punctuation-insensitive", "whitespace-insensitive"), $item/@weight)
else ()
else ()
return
if(empty($query))
then cts:word-query(string($term))
Expand Down

0 comments on commit ebbb97a

Please sign in to comment.