Here's an actual proposal for unifying the simple and live apis. I'm not saying that we really really should do this, just that it is doable, and it still allows for quite simple use cases (see below). It is actually very much in spirit with Magnus' very first proposal a while back. Praise late insight :-)
<br><br>== Unified API Proposal ==<br><br>NewSession (out s session)<br>&nbsp;* <br>&nbsp;<br>SetProperty (in s session, in s prop, in s val)<br>&nbsp;* Set a property on the session. Prominent ones are<br>&nbsp;&nbsp; - live : whether or not to be in live mode. Default false.
<br>&nbsp;&nbsp; - hit.properties : semi colon separated list of field names. Default &quot;uri&quot;.<br>&nbsp;<br>GetProperty (in s session, in s prop)<br>&nbsp;* <br>&nbsp;<br>CloseSession (in s session)<br>&nbsp;* Close the session and all child searches
<br><br>Search (in s session, in s query_xml, out s search)<br>&nbsp;* Start a new search from a query<br>&nbsp;<br>CountHits (in s search, out i count)<br>&nbsp;* Returns the current number of found hits. If live=false this call blocks until the index has been fully searched.
<br>&nbsp;<br>GetHits (in s search, in i num, out aav hits)<br>&nbsp;* Return num hits. If live=false this call blocks until there is num hits available or the index has been fully searched.<br>&nbsp;&nbsp; The client should keep track of each hit&#39;s serial number if it want to use GetHitData later.
<br>&nbsp;<br>GetHitData (in s search, in ai hit_ids, in as properties, out aav hit_data)<br>&nbsp;* Get hit metadata. Intended for snippets or modified hits. hit_ids are serial numbers as obtained from GetHits.<br>&nbsp;<br>CloseSearch (in s search)
<br>&nbsp;* Close and free a search.<br><br>SIGNAL HitsAdded (in i count)<br>SIGNAL HitsRemoved (in ai hit_ids)<br>SIGNAL HitsModified (in ai hit_ids)<br><br>== Session Properties ==<br>&nbsp;* live : Default false.<br>&nbsp;* hit.properties
 : the properties to return in GetHits. Default &quot;uri&quot;.<br>&nbsp;<br>== Use Cases ==<br>Retrieve a list of URIs matching a query:<br><br>session = NewSession()<br>search = Search (session, query)<br>hits = GetHits (search, 1000)
<br>CloseSession (session)<br><br>A live search:<br><br>session = NewSession()<br>SetProperty (session, &quot;live&quot;, &quot;true&quot;)<br>SetProperty (session, &quot;hit.properties&quot;, &quot;uri ; dc:title&quot;)<br>
search = Search (session, query)<br>&lt;loop and wait for signals&gt;<br>if HitsAdded(count):<br>&nbsp;&nbsp; &nbsp;GetHits(session, count)<br>&nbsp;&nbsp; &nbsp;&lt;update ui&gt;<br>&nbsp;&nbsp; &nbsp;GetHitData (search, hit_ids, &quot;snippet&quot;)<br>&nbsp;&nbsp; &nbsp;&lt;update ui with snippets&gt;
<br>else if HitsRemoved (hit_ids):<br>&nbsp;&nbsp; &nbsp;&lt;remove all affected hits&gt;<br>else if HitsModified (hit_ids):<br>&nbsp;&nbsp; &nbsp;new_data = GetHitData(search, hit_ids, &quot;uri ; dc:title; snippet&quot;)<br>&nbsp;&nbsp; &nbsp;&lt;update ui with new data&gt;
<br>...<br>CloseSearch (search)<br>...<br><br><br>Cheers,<br>Mikkel<br>