<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.logspace.co.uk/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom">

        <title>Logspace - Ben Blackburne</title>
        
        <link href="http://logspace.co.uk/" />
        <updated>2012-01-18T14:13:51-08:00</updated>
        <id>http://logspace.co.uk/</id>
        <author>
                <name>Ben Blackburne</name>
                <email>bpb@lysozyme.net</email>
        </author>

        
        <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.logspace.co.uk/logspace" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="logspace" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
                <title>Using RJB to manipulate SAM files in Ruby</title>
                <link href="http://logspace.co.uk/2009/09/03/rjb-and-sam.html" />
                <updated>2009-09-03T00:00:00-07:00</updated>
                <id>http://logspace.co.uk/2009/09/03/rjb-and-sam</id>
                <content type="html">&lt;p&gt;&lt;a href="http://samtools.sourceforge.net/"&gt;&lt;span class="caps"&gt;SAM&lt;/span&gt;&lt;/a&gt; is a new file format for representing genomic sequence alignments. There are apis available for &lt;a href="http://picard.sourceforge.net/"&gt;Java&lt;/a&gt;, &lt;a href="http://search.cpan.org/~lds/Bio-SamTools/"&gt;Perl&lt;/a&gt;, and &lt;a href="http://code.google.com/p/pysam/"&gt;Python&lt;/a&gt;.  But none for Ruby as far as I know, which is a shame when you want to manipulate &lt;span class="caps"&gt;SAM&lt;/span&gt; files in a rakefile. But &amp;#8211; there is a little hackette we can pull. First, install &lt;a href="http://rjb.rubyforge.org/"&gt;&lt;span class="caps"&gt;RJB&lt;/span&gt;&lt;/a&gt; (the Ruby Java Bridge). Then we can do interesting things with the &lt;a href="http://picard.sourceforge.net/"&gt;Picard Java &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;This routine will load a bam file (i.e. a binary &lt;span class="caps"&gt;SAM&lt;/span&gt; file), excise the sequences overlapping the regions listed in file &amp;#8220;regions&amp;#8221; (as &amp;#8220;chr start end&amp;#8221;), and print them out in &lt;a href="http://en.wikipedia.org/wiki/FASTQ_format"&gt;fastq format&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;rjb&amp;#39;&lt;/span&gt;
&lt;span class="c1"&gt;#Setup JVM:&lt;/span&gt;
&lt;span class="no"&gt;Rjb&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;classpath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.:./sam-jdk-1.0.3.jar&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jvmargs&lt;/span&gt;&lt;span class="o"&gt;=[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;bam&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;alignment.bam&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;bai&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bam&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.bai&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;#Some ugly bridging code:&lt;/span&gt;
&lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Rjb&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;java.io.File&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;samfilereader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Rjb&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;net.sf.samtools.SAMFileReader&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#most BAM files I&amp;#39;ve seen have errors, so let&amp;#39;s be lenient:&lt;/span&gt;
&lt;span class="n"&gt;samfilereader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setDefaultValidationStringency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="no"&gt;Rjb&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;net.sf.samtools.SAMFileReader$ValidationStringency&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LENIENT&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#Instantiate the java object:&lt;/span&gt;
&lt;span class="n"&gt;sam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;samfilereader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_with_sig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;Ljava.io.File;Ljava.io.File;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bam&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bai&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#From here on it&amp;#39;s plain sailing&lt;/span&gt;
&lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;regions&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each_line&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;
        &lt;span class="c1"&gt;#we can use ruby ints and strings in java methods:&lt;/span&gt;
        &lt;span class="n"&gt;overlapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sam&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queryOverlapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;to_i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;to_i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;overlapping&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hasNext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;overlapping&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;
                &lt;span class="c1"&gt;#pull out what we need from the SAMRecord object:&lt;/span&gt;
                &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;@&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getReadName&lt;/span&gt; 
                &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getReadString&lt;/span&gt;
                &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;+&amp;quot;&lt;/span&gt; 
                &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getBaseQualityString&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
        &lt;span class="n"&gt;overlapping&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;I was pleasantly suprised that once the SAMFileReader object is created, using the &lt;span class="caps"&gt;API&lt;/span&gt; is quite nice! Hope this is useful to someone using &lt;span class="caps"&gt;SAM&lt;/span&gt; in Ruby.&lt;/p&gt;</content>
        </entry>
        
        <entry>
                <title>Querying db4o in Scala</title>
                <link href="http://logspace.co.uk/2009/06/17/db4o-with-scala.html" />
                <updated>2009-06-17T00:00:00-07:00</updated>
                <id>http://logspace.co.uk/2009/06/17/db4o-with-scala</id>
                <content type="html">&lt;p&gt;&lt;a href="http://www.db4o.com/"&gt;Db4o&lt;/a&gt; is a native java/C# database framework. In a db4o database, you can easily&lt;br /&gt;
store and retieve java objects. This all seems rather nice, but when using db4o&lt;br /&gt;
with &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;, there is a snag.&lt;/p&gt;
&lt;p&gt;Db4o allows easy construction of querys by implementing their &lt;code&gt;Predicate&lt;/code&gt; interface. Example, from their &lt;a href="http://www.db4o.com/about/productinformation/resources/db4o-7.4-tutorial-java.pdf"&gt;tutorial&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="java"&gt;&lt;span class="n"&gt;List&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Pilot&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pilots&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Predicate&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Pilot&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; 
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pilot&lt;/span&gt; &lt;span class="n"&gt;pilot&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; 
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pilot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPoints&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; 
   &lt;span class="o"&gt;}&lt;/span&gt; 
&lt;span class="o"&gt;});&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The idea is that, rather than running every object in the database past the&lt;br /&gt;
filter &lt;code&gt;.getPoints()==100&lt;/code&gt;, db4o parses the bytecode and looks for&lt;br /&gt;
objects that match using the database index. However, &lt;a href="http://www.matthewtodd.info/?p=68"&gt;this doesn&amp;#8217;t seem to work for Scala bytecode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Maybe at some point this will be fixed. But for now, Scala&amp;#8217;s syntax comes to the rescue. Db4o converts &lt;code&gt;Predicate&lt;/code&gt; implementations into something called a &lt;span class="caps"&gt;SODA&lt;/span&gt; query. The code for constructing a &lt;span class="caps"&gt;SODA&lt;/span&gt; query from scratch in Java, looks like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="java"&gt;&lt;span class="n"&gt;Query&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; 
&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;constrain&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pilot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; 
&lt;span class="n"&gt;Query&lt;/span&gt; &lt;span class="n"&gt;pointQuery&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;descend&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;points&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; 

&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;descend&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;constrain&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Rubens Barrichello&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; 
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;or&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pointQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;constrain&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="o"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;greater&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; 
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;and&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pointQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;constrain&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;199&lt;/span&gt;&lt;span class="o"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;smaller&lt;/span&gt;&lt;span class="o"&gt;()));&lt;/span&gt; 

&lt;span class="n"&gt;ObjectSet&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; 
&lt;span class="n"&gt;listResult&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;(Again, this is from the &lt;a href="http://www.db4o.com/about/productinformation/resources/db4o-7.4-tutorial-java.pdf"&gt;tutorial&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Pretty ugly, huh? However, a Scala version is not too bad:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="scala"&gt;&lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;
&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;constrain&lt;/span&gt; &lt;span class="n"&gt;classOf&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Pilot&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;descend&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;name&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;constrain&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Rubens Barrichello&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;or&lt;/span&gt;
  &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;descend&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;points&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;constrain&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt; &lt;span class="n"&gt;greater&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; 
  &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;descend&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;points&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;constrain&lt;/span&gt; &lt;span class="mi"&gt;199&lt;/span&gt; &lt;span class="n"&gt;smaller&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt;
&lt;span class="n"&gt;listResult&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;From a few minutes play, it seems that things work like they should &amp;#8211; you can use parentheses to surround subqueries and connect with &lt;code&gt;and&lt;/code&gt; or &lt;code&gt;or&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="scala"&gt;&lt;span class="o"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;descend&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;name&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;constrain&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Rubens Barrichello&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;or&lt;/span&gt; 
  &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;descend&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;points&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;constrain&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt; &lt;span class="n"&gt;greater&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; 
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;descend&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;points&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;constrain&lt;/span&gt; &lt;span class="mi"&gt;199&lt;/span&gt; &lt;span class="n"&gt;smaller&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Means (&amp;#8220;Reubens Barrichello&amp;#8221; OR &amp;gt; 99 points ) &lt;span class="caps"&gt;AND&lt;/span&gt; &amp;lt; 199 points, while:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="scala"&gt;&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;descend&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;name&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;constrain&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Rubens Barrichello&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;or&lt;/span&gt; 
  &lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;descend&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;points&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;constrain&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt; &lt;span class="n"&gt;greater&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; 
    &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;descend&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;points&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;constrain&lt;/span&gt; &lt;span class="mi"&gt;199&lt;/span&gt; &lt;span class="n"&gt;smaller&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;means &amp;#8220;Reubens Barrichello&amp;#8221; OR (&amp;gt; 99 points  &lt;span class="caps"&gt;AND&lt;/span&gt; &amp;lt; 199 points).&lt;/p&gt;
&lt;p&gt;This actually isn&amp;#8217;t too bad to work with, after all!&lt;/p&gt;</content>
        </entry>
        

</feed>

