If you're interested in functional programming, you might also want to checkout my second blog which i'm actively working on!!

Wednesday, December 19, 2012

Using Options in XQuery

As a developer you try to use best practices from different toolkits, frameworks, programming languages. One of the things Scala solves nicely in their core libraries is avoiding nullpointer exceptions. So I decided to hack this idea into some XQuery functions for fun.
   <!-- Taking  the same approach as Scala we return options which are either none or some -->
   <option>
     <none/>
   </option>
   
   <option>
     <some>4</some>
   </option> 

   <!-- Example of a lookup map represented in XML -->
   <map>
     <entry key="PH3330L">SOT669</entry>
     <entry key="BUK100-50GL">SOT78B</entry>
     <entry key="PSMN003-30B">SOT404</entry>
   </map>   

An example of how you could model options in XQuery and build some utility functions to make your code more safe.
declare function local:getOrElse($map as element(map), $key as xs:string, $else)  {
    let $option := local:get($map, $key)
    return (if (empty($option/some)) then $else else data($option/some))
};

declare function local:get($map as element(map), $key as xs:string) as element(option) {
    (if (empty($map/entry[@key=$key])) then <option><none/></option> else <option><some>{data($map/entry[@key=$key])}</some></option>)
};

let $map1 := 
   <map>
     <entry key="PH3330L">SOT669</entry>
     <entry key="BUK100-50GL">SOT78B</entry>
     <entry key="PSMN003-30B">SOT404</entry>
   </map> 
 
let $map2 :=    
   <map>
     <entry key="robby">1977</entry>
     <entry key="ivan">1987</entry>
   </map>  
 
return 
  <lookups>
    <package>{local:getOrElse($map1, "PH3330L", "test1")}</package>
    <package>{local:getOrElse($map1, "INVALID", "test1")}</package>
    <age>{2012 - local:getOrElse($map2, "robby", 0)}</age>
    <age>{2012 - local:getOrElse($map2, "amanda", 2012)}</age>
  </lookups>  


The result looks like this if you test it on e.g. Zorba.
<lookups>
  <package>SOT669</package>
  <package>test1</package>
  <age>35</age>
  <age>0</age>
</lookups>

No comments:

Post a Comment