>although I was surprised about the reported execution times at that time
Yes my test was a bit harsh :-) ab -n 100 -c 10 http://localhost:8984/bsp/simple Is 100 requests as fast as possible with 10 concurrent. I also had nearly 2Mb of parser code in XQuery generated by REX [1] just in one app. Thanks for the tips. /Andy [1] http://www.bottlecaps.de/rex/ On 7 May 2014 11:24, Christian Grün <[email protected]> wrote: > > However one thing to be aware of with the current implementation is that > > response times depend on the quantity of XQuery code defined, making > large > > applications problematic. This was mentioned in Christian's recent > "Upcoming > > features" email, so I am sure it will be addressed soon. > > I agree with Andy (although I was surprised about the reported > execution times at that time). In one of our projects, we now have > around 500 KB of XQuery code, and the constant overhead for evaluating > a single REST request is about 40 ms - which may be too slow if you > have lots of requests per seconds. > > However, if you encounter bottlenecks, there are already various ways > to improve performance (all of them undocumented, I guess - once > again, Wiki edits are welcome..): > > * Move all XQuery modules without RESTXQ annotations into your > repository ("repo" directory) [1]. This can be done manually (there is > no need to use the REPO commands), and you can edit XQuery modules > directly in your repo directory. > > * Only keep those XQuery modules in your restxq directory which are > required in your project. > > The reason is that the restxq directory is scanned for changes every > time a new request takes place. We think about introducing a RELEASE > mode in a future version, in which various checks will be skipped that > are required during the development stage. > > Hope this helps, > Christian > > [1] http://docs.basex.org/wiki/Repository > > > > > >> Hello Yoann, > >> > >> You do not "need to do so", but I remember your project quite well and I > >> was one of the people who said you don't actually need PHP. From what I > >> saw and remember, I think RestXQ is simply a much better fit. > >> > >> RestXQ enables you to do complete server-side processing (just like PHP > >> does) using XQuery. You can define all sorts of options for your > >> functions using annotations and how it should be served to your users. > >> > >> Theoretically, this would also be possible using Rest. However, the Rest > >> interface is more intended for short queries and querying on a data set. > >> You will always have to submit your query and of course this is very > >> impractical and slow if you develop a whole web app. > >> But it might be a good idea to add something to the documentation to > >> make the distinction between rest and RestXQ clearer. So much we could > >> add to the docs, actually... :) > >> > >> Cheers, > >> Dirk > >> > >> On 07/05/14 10:44, Yoann Maingon wrote: > >> > Thx > >> > > >> > I look into the provided example. At first I was more going into Rest > >> > and > >> > not RestXq, but if I need to do so then I guess I need to spend some > >> > time > >> > on it. > >> > Open sourcing our projects is a good question. > >> > I still have some colleagues affraid to somehow loose what they've > >> > developped and I don't have a clear opinion about it. But I'd be happy > >> > to > >> > share code (you may regret it! I'm a bad developper !) > >> > > >> > > >> > *Cordialement / Best Regards,* > >> > > >> > *Yoann Maingon* > >> > Minerva France > >> > > >> > *+33 6 64 32 49 66* > >> > > >> > Download Aras Innovator - Téléchargez Aras > >> > Innovator< > http://www.aras.com/support/downloads/downloadInnovator.aspx> > >> > > >> > > >> > > >> > > >> > 2014-05-07 10:18 GMT+02:00 Dirk Kirsten <[email protected]>: > >> > > >> >> Hi, > >> >> > >> >> I agree with Max that it would be a good idea to have a list of > >> >> projects > >> >> and examples, which are build on top of BaseX. A problem might be > that > >> >> many applications which are build on top of BaseX are not open > source. > >> >> > >> >> @Yoann: Please be aware that there is a Rest and RestXQ > implementation > >> >> within BaseX, which are quite different. What you most likely want to > >> >> use is RestXQ. Some documentation is available at > >> >> https://docs.basex.org/wiki/RESTXQ > >> >> Using RestXQ itself, there is an example for a blog at > >> >> https://github.com/siserle/blog-example > >> >> > >> >> As Max already suggested, the main difference when you use it with > >> >> angular or some other framework is that you most likely want to > return > >> >> JSON, so you have to change the output method. > >> >> > >> >> Cheers, > >> >> Dirk > >> >> > >> >> On 07/05/14 09:34, Maximilian Gärber wrote: > >> >>> Hi Yoann, > >> >>> > >> >>> I guess having examples like these would be helpful in general. > >> >>> Together with basex, we built a larger project for managing > conference > >> >>> registrations etc. last year. I could extract some of the modules - > >> >>> maybe we could manage to publish them on some github repo or a > >> >>> dedicated site? @basex: maybe it is time for a basex contrib page? > >> >>> > >> >>> What you need, is some json endpoint which leverages the session > >> >>> module, checks the credentials and returns some json back to Angular > >> >>> (or JQuey) > >> >>> > >> >>> Besides that, you need to secure all your restxq endpoints with a > >> >>> authentication check: > >> >>> > >> >>> if(not(session:logged-in())) then web:redirect($C:START-PAGE) > else > >> >>> _:do-something-useful() > >> >>> > >> >>> > >> >>> Login example: > >> >>> > >> >>> > >> >>> import module namespace session = > >> >>> "http://basex.org/modules/web/session > >> >> "; > >> >>> > >> >>> declare > >> >>> %restxq:path("/api/login/check") > >> >>> %restxq:POST("{$content}") > >> >>> %output:method("json") > >> >>> %output:json("lax=yes") > >> >>> function _:check( > >> >>> $content as item()* > >> >>> ) > >> >>> { > >> >>> let $user := $content//u/string() > >> >>> let $pass := $content//p/string() > >> >>> > >> >>> let $ok := _:check-user($user, $pass) > >> >>> > >> >>> if ($ok) then > >> >>> let $user-id := session:id() > >> >>> let $role := session:role() > >> >>> return((), > >> >>> <json objects="json"> > >> >>> <url>{_:redirect-url-from-role($role)}</url> > >> >>> </json> > >> >>> ) > >> >>> else > >> >>> <json objects="json"> > >> >>> <error>Login failed.</error> > >> >>> </json> > >> >>> }; > >> >>> > >> >>> > >> >>> angular.module('login', []) > >> >>> .config([ > >> >>> '$routeProvider', > >> >>> function ($routeProvider) { > >> >>> $routeProvider.when('/Logout', { > >> >>> redirectTo: '/restxq/logout' > >> >>> }); > >> >>> }]) > >> >>> > >> >>> .controller('LoginCtrl', [ > >> >>> '$scope', '$http', '$location', > >> >>> function ($scope, $http, $location) { > >> >>> $scope.login = function() { > >> >>> var url = '/restxq/api/login/check'; > >> >>> > >> >>> //use jquery here, because angular does not detect auto-fill > >> >>> data > >> >>> var payload = { > >> >>> u: $('#u').val(), > >> >>> p: $('#p').val() > >> >>> }; > >> >>> > >> >>> $http.post(url, payload). > >> >>> success(function(data) { > >> >>> if (data.error) { > >> >>> // trigger error status > >> >>> $scope.loginForm.$error.failed = true; > >> >>> } else { > >> >>> // redirect > >> >>> window.location.pathname = data.url; > >> >>> } > >> >>> }). > >> >>> error(function(data, status, headers, config) { > >> >>> alert("Could not load data from server.") > >> >>> }); > >> >>> }; > >> >>> }]); > >> >>> > >> >>> <div class="row" ng-controller="LoginCtrl"> > >> >>> <div class="span6 offset3"> > >> >>> <h2 class="alumni-name">Please Login</h2> > >> >>> > >> >>> <div class="alert alert-error" > >> >>> ng-show="loginForm.$error.failed"> > >> >>> <p> > >> >>> Incorrect login data. Please try again. > >> >>> </p> > >> >>> </div> > >> >>> <form name="loginForm"> > >> >>> <table cellpadding="3"> > >> >>> <tr> > >> >>> <td>Username  </td> > >> >>> <td><input type="text" name="u" id="u" ng-model="user" > >> >>> style="width:146px !important;margin:0"/></td> > >> >>> </tr> > >> >>> <tr> > >> >>> <td>Password   </td> > >> >>> <td><input id="p" name="p" ng-model="password" > >> >>> style="width:146px !important;margin:0" type="password" /></td> > >> >>> </tr> > >> >>> <tr> > >> >>> <td/> > >> >>> <td><button ng-click="login()" class="btn" > >> >>> style="width:152px !important;margin:0">Login</button> > >> >>> </td> > >> >>> </tr> > >> >>> </table> > >> >>> > >> >>> </form> > >> >>> </div> > >> >>> </div> > >> >>> > >> >>> Regards, > >> >>> > >> >>> Max > >> >>> > >> >>> > >> >>> > >> >>> > >> >>> 2014-05-07 1:38 GMT+02:00 Yoann Maingon > >> >>> <[email protected]>: > >> >>>> Hi, > >> >>>> > >> >>>> After xmlprague and my presentation at the BaseX user group I was > >> >>>> told > >> >> (and > >> >>>> I agree) that it wasn't really smart to use php for what I was > >> >>>> building > >> >> as > >> >>>> it had almost no added value as I could directly query basex using > >> >>>> the > >> >> Rest > >> >>>> Interface. > >> >>>> > >> >>>> Does anyone as some example using either angularjs or jquery ? I > >> >>>> think > >> >> I'm > >> >>>> struggling with the login. Even just trying with a Rest test tool, > I > >> >> can see > >> >>>> that I have error messages in Basex telling me theat access was > >> >>>> refused. > >> >>>> > >> >>>> > >> >>>> Yoann Maingon > >> >>>> CEO - mydatalinx > >> >>>> +33664324966 > >> >> > >> >> -- > >> >> Dirk Kirsten, BaseX GmbH, http://basex.org > >> >> |-- Firmensitz: Blarerstrasse 56, 78462 Konstanz > >> >> |-- Registergericht Freiburg, HRB: 708285, Geschäftsführer: > >> >> | Dr. Christian Grün, Dr. Alexander Holupirek, Michael Seiferle > >> >> `-- Phone: 0049 7531 28 28 676, Fax: 0049 7531 20 05 22 > >> >> > >> > > >> > >> -- > >> Dirk Kirsten, BaseX GmbH, http://basex.org > >> |-- Firmensitz: Blarerstrasse 56, 78462 Konstanz > >> |-- Registergericht Freiburg, HRB: 708285, Geschäftsführer: > >> | Dr. Christian Grün, Dr. Alexander Holupirek, Michael Seiferle > >> `-- Phone: 0049 7531 28 28 676, Fax: 0049 7531 20 05 22 > > > > >

