SQlike is another effort in the same direction. It provides a wide range of SQL features including joins. JavaScript tables
are used as query language.
This looks pretty handy for large datasets, to be sure.
SpahQL is definitely much lighter than that - the API is intended to be more jquery-like with a specific selector language, each selection returning a resultset object which then provides methods for subselections and modifications.
Author here. I wanted to try something a little lighter than jsonpath and with a specific mode of (node collection|descent) that allowed set arithmetic to be the primary means of comparisons and assertions. This allowed me to obviate the need for scoped AND/OR structures and instead provide a broad range of assertion options using superset, subset, disjoint and joint set operations.
It's most certainly not perfect, but I had fun experimenting with it.
it's a nice project, and if it adds something extra then go for it :)
but sometimes I think jsonpath should be more visible and it's not, that's why I was trying to avoid fragmentation for the same solution. But as you said, it tries a different approach so it makes sense to use a different syntax.
linq.js has been doing this for years now. Its a mature library, flexible and light.
I use it for every web project, wouldn't know what to do with out it.
http://linqjs.codeplex.com/
Examples: http://neue.cc/reference.htm
Features
--------------------------------------
implement all .NET 4.0 methods and many extra methods
(inspiration from Rx, Achiral, Haskell, Ruby, etc...)
complete lazy evaluation
full IntelliSense support for VisualStudio
two versions - linq.js and jquery.linq.js (jQuery plugin)
support Windows Script Host
binding for Reactive Extensions for JavaScript(RxJS) and
IntelliSense Generator -> see documentation
NuGet install support(linq.js, linq.js-jQuery, linq.js-Bindings)
90 Methods
----------------------------------------
Aggregate, All, Alternate, Any, Average, BufferWithCount,
CascadeBreadthFirst, CascadeDepthFirst, Catch, Choice,
Concat,Contains, Count, Cycle, DefaultIfEmpty, Distinct, Do,
ElementAt, ElementAtOrDefault, Empty, Except, Finally, First,
FirstOrDefault, Flatten, ForEach, Force, From, Generate,
GetEnumerator, GroupBy, GroupJoin, IndexOf, Insert, Intersect,
Join, Last, LastIndexOf,
LastOrDefault, Let, Matches, Max, MaxBy, MemoizeAll, Min,
MinBy, OfType, OrderBy, OrderByDescending, Pairwise,
PartitionBy, Range, RangeDown, RangeTo, Repeat,
RepeatWithFinalize, Return, Reverse, Scan, Select, SelectMany,
SequenceEqual, Share, Shuffle,
Single, SingleOrDefault, Skip, SkipWhile, Sum, Take,
TakeExceptLast, TakeFromLast, TakeWhile, ThenBy,
ThenByDescending, ToArray,
ToDictionary, ToInfinity,ToJSON, ToLookup, ToNegativeInfinity,
ToObject, ToString, Trace, Unfold, Union, Where, Write,
WriteLine, Zip
Good utility, but I had a few specific itches to scratch with SpahQL:
* Declarative syntax for selections, such that selection queries may be handed between implementations in other languages
* Imperative syntax for updates, such that updates may be idiomatic to the language in which the spahql library has been ported (linq meets this criteria)
In essence all SpahQL is, is a shorthand syntax for generating traversal and descent functions, which output a proxy object for reading to and writing from the selected nodes.
I wish developers would stop copying SQL. It's like making fancy new languages, and then adding libraries that help you emulate COBOL. SQL is not the first, the last, or the best query language ever created, it's just the best marketed. It's not even properly relational, it's based on a series of shell scripts on multics for crying out loud!
Well back when SQL was first created, there was a superior alternative named QUEL. Fast forward to today, and with the proliferation of programming languages that easily support high level concepts, it doesn't take that much imagination to think of better ways of dealing with large relation-values. linq for example. Going along a different direction, the language Prolog, and its much improved derivative Mercury take the concept of query languages to really amazingly awesome places. The quite well done software package PrinceXML was written in Mercury.
I'm all for empowering people to do useful work, but when you're empowering them to do stupid things that will have to be rewritten later, it's less good.
Hope you get some use out of it - don't forget to let me know any issues you have. Also there's some other neat JS-querying systems linked in these comments, so check those out and see which meets your needs!
Can you unpack that question a little for me? As in, could you use a spahql selection as the path component of some request? I don't see why not, but the escaping will probably look a little ugly.
The only small issue I can see with that is identifying where the path to the resource ends and where the query to applied to the JSON representation of the resource starts.
A webserver could easily figure that out, as long as it is configured correctly and with knowledge of the domain. I don't like using query strings like this, as it makes the URL point to multiple objects.
I'm not sure it could, if I have a resource with a URL:
www.example.com/foo
and it can arbitary sub-resources e.g.
www.example.com/foo/bar/raz
then how do I know whether bar is a different resource or part of the JSON returned describing www.example.com/foo
This would mean you'd have to restrict your resource names to ensure they don't clash with JSON names - which seems a pain (e.g. say the resource names are uploaded files and directories, so you won't have much control over what they are called)
Replying to the reply to this- I am pretty sure the webserver can easily find out that foo is a JSON file when resolving the path. Most operating systems don't let you name a file and a directory the same thing, so the file system API knows straight away there is no such directory named "foo", and can have special handling for whatever kind of file "foo" happens to be. (in this case, JSON)
None whatsoever apart from to say that it's acceptably fast for whatever data set I happen to throw at it. Another poster here mentioned in an email that he'd tried it against arrays of ~50000 object structures and it was fine.
SQlike is another effort in the same direction. It provides a wide range of SQL features including joins. JavaScript tables are used as query language.
See http://www.thomasfrank.se/sqlike.html for an overview and http://www.thomasfrank.se/SQLike/ for examples.