2006/11/28, Joe Shaw &lt;<a href="mailto:joeshaw@novell.com" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">joeshaw@novell.com</a>&gt;:<div><span class="gmail_quote"></span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

On Tue, 2006-11-28 at 07:15 +0100, Mikkel Kamstrup Erlandsen wrote:<br>&gt; I think everybody wants that (atleast I do). However the idea about<br>&gt; org.freedesktop.search.simple was to have a *simple* interface. Here
<br>
&gt; the simple only applies to the end user-app developers.<br><br>Yeah, I can certainly appreciate that.<br><br>&gt;&nbsp;&nbsp;1) Targetted at apps where searching is not the main functionality,<br>&gt; fx. a music browser, or filemanager.
<br>&gt;&nbsp;&nbsp;2) There should be no query building on the application end. Just<br>&gt; pass the string as entered by the user to quuery method.<br>&gt;&nbsp;&nbsp;3) Should be dead easy to drop in your app with only a few lines of<br>

&gt; code<br><br>I agree in principle, but I disagree with point number #2 here.&nbsp;&nbsp;One<br>reason is that it's generally not a good idea to programmatically build<br>a string query.&nbsp;&nbsp;They can be error prone but more importantly they're
<br>just slow.<br><br>Take a look at the Beagle backend in Nautilus:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://cvs.gnome.org/viewcvs/nautilus/libnautilus-private/nautilus-search-engine-beagle.c?annotate=1.2.2.1" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">
http://cvs.gnome.org/viewcvs/nautilus/libnautilus-private/nautilus-search-engine-beagle.c?annotate=1.2.2.1
</a><br><br>(roughly around line 180)<br><br>The API is still very simple, but we set some important details on the<br>query to limit its scope:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* We only want files; no emails, IM logs, addressbook contacts,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;etc.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* We want a maximum of 1000 hits.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* Optionally, we may only want a set of certain MIME types.<br><br>And we also obviously set the string the user typed in, which is<br>actually a query language string, so they can add more advanced
<br>properties, like 'author:&quot;Charles Dickens&quot;'.</blockquote><div><br><br>I think I see where the disagreement comes from. Currently the premise for the simple search api has been that it didn't need any language bindings. Applications would certainly wrap the interface in a native object allowing for mainloop integration, but it didn't need any code from the Wasabi project to work.
<br>&nbsp;</div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>&gt; The problem is that 2) warrents a simple search language to be defined
<br>&gt; to make much sense... 3) is a bit against the nature of your
<br>&gt; suggestion.<br><br>I think the simplicity of the Beagle API belies your assertion on point<br>3.&nbsp;&nbsp;Moreover, not making it asynchronous is going to drastically reduce<br>the usefulness in GUI apps.&nbsp;&nbsp;There are dozens of examples in GNOME alone
<br>that show this.<br></blockquote><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Writing responsive GUI apps is Just Hard.&nbsp;&nbsp;The Beagle API has tried to
<br>make this as simple as possible.&nbsp;&nbsp;You can implement a fully working<br>asynchronous Beagle client that fits in with the GLib main loop in about
<br>100 lines:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://cvs.gnome.org/viewcvs/beagle/libbeagle/examples/beagle-search.c?annotate=1.4" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">http://cvs.gnome.org/viewcvs/beagle/libbeagle/examples/beagle-search.c?annotate=1.4
</a><br><br>We could add a synchronous API to this -- which wouldn't have the
<br>benefits of Live Queries -- but to still have it work correctly in a GUI<br>app you would have to do all of your searches in a thread.&nbsp;&nbsp;At least in<br>C, that's definitely harder to do than integrating with the main loop.
</blockquote><div><br><br>Again such an api needs bindings for the toolkit being used. I'm not against this - actually on the contrary, I just think that we should also have an api that is easy to use even though you don't use the bindings for your platform.
<br><br>I still think it is possible to write a responsive ui with with the paging queries instead of the fully async ones. An application need not request 1000 hits at a time it could send 10 queries requesting the hit ranges n*100 to (n+1)*100 for n=0..9. An example of this is the Tracker search tool and the Tracker deskbar plugin (actually they only perform one query, but still).
<br></div><br>Another concern I have (that might be based in ignorance) is that a dbus api with lots of temporary objects (queries) might be a lot of work for search engines not having something close to this already. Maybe it is not that hard to keep track of the objects, I really don't have much experience here...
<br><br><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">&gt; A signal driven query response is dead easy to work with when you<br>&gt; Query object is a gobject, but when it is a dbus object matters get (a
<br>&gt; little) more tricky. I'm not totally against this idea (signal driven
<br>&gt; query response), but I can't see how we could KIS.<br><br>Recall that the low-level D-Bus APIs are not for application authors,<br>though.&nbsp;&nbsp;Although most of the bindings aren't quite there yet, app<br>authors should be targetting GLib, QT, Python, Mono, etc. bindings.&nbsp;&nbsp;And
<br>that would map D-Bus signals onto callbacks in the native platform.&nbsp;&nbsp;I<br>don't think it's a good idea to intentionally cripple an API to work<br>around a (temporary) deficiency in the platform.<br><br>&gt; Do you have any specific idea for a dbus interface?
<br><br>I don't have anything concrete in mind, but mapping something like the<br>Beagle query APIs onto a D-Bus interface seems like a decent first step.</blockquote><div><br>&nbsp;</div>Yeah, I think the libbeagle api is nice to work with I give you that. 
<br><br>The ideal situation for me would be a &quot;lowlevel&quot; dbus api that could be used directly or through some bindings for your platform. My intuition however tells me that it might be better with a simple API resembling the currrent proposal and another api to implement platform specific objects on.
<br><br><br></div>Cheers,<br>Mikkel<br>