MLJS Versus - adamfowleruk/mljs GitHub Wiki

This page compares MLJS against other alternatives. If you think of one I've missed, please let me know by logging an issue on GitHub.

##MLJS vs. Visualisation Widgets MarkLogic includes some built in Visualisation Widgets. These are used extensively by the Application Builder web GUI wizard to create quick start applications. They too wrap the REST API and provide common search and graphing capabilities.

The Vis Widgets are quick to build an app and don't require developer level knowledge. The Application Builder wizard is a great place to quickly configure an app and start exploring content. Once you go beyond what is provided, however, then customising applications can be tricky.

Examples include customising how things are displayed - this requires XSLT, and means you lose control over rendering in application code as it's handed off to the server. There are a few things that Vis widgets do provide that MLJS hasn't caught up with yet. This includes a configurable document preview page, bookmarking, google maps, and clickable chart widgets. MLJS does support JSON results displaying though.

Below is a full comparison between the two. I aim before November 2013 for MLJS to surpass what the Visualisation Widgets provide.

Feature MLJS Visualisation Widgets
Core API ... ...
- Works in WebApp in a MarkLogic REST App Yes Yes
- Works in WebApp outside of MarkLogic Not yet (Aim to support W3C CORS API, so no proxying required) Yes, via Proxy on app server
- Works in NodeJS Yes No
- Wraps REST communication complexity (E.g. authentication) Yes No, directly invokes jQuery AJAX support for each search method in controller (not a multi layered API)
Widgets ... ...
- Security/Login Relies on Roxy or wrapper app for this (browser context) None, relies on Browser context
- Search Bar, Paging, Sorting, Facets, Results widgets Yes Yes
- Search Context object to link widgets to one search Yes Yes
- Suggestions as you type Not yet Yes in search bar, if configured
- Chart support for aggregations (facet values) Yes Yes
- Chart support for in document values Yes No
- Charts supported All HighCharts, multi axes, multi series (Tested Line, Spline, Bar, Stacked Bar, Column, Stacked Column, Area, Stacked Area, Pie) Pie, Line, Column, Bar only, single series, single axis
- Charts navigable? (Affects facets) Yes Yes (also see shadow queries, below)
- Co-occurence widget Yes, navigable too No
- File Upload Widget Yes, with Security No
- XHTML security markings widget Yes, with Doc properties and triple extraction No
- Tabular Widget Yes, Google Kratu No
- Mapping widget Yes, OpenLayers based for maximum interoperability. Includes heatmaps, polygon, radius, bounding box search too Yes, with heatmaps, point clustering and polygon creation
- Generic Document View page No (Do have a generic HTML view page), achievable via REST API's GET /v1/document endpoint with XSLT or XQuery transform referenced Yes, via XSLT
- Shadow Queries (Selecting a chart value updates other widgets, but not itself, thus preserving all selectable options) No (Will instead implement a setUpdateAfterSelect(false) method, should this be asked for) Yes
- OOTB Result Rendering Yes (XHTML XML, Any XML, Any JSON, plain text, snippets) Yes (XML only with snippeting? Treats all results like this no matter source document type.)
- ML 7 Semantic widgets Yes - SPARQL query builder, entity list, entity facts, graph and document explorer No
- User dashboarding widget In development 'Workplace' widget No, configurable by admin only in Application Builder
Tools ... ...
- Wizard driven app builder In development 'Workplace' widget Yes, the Application Builder
- App deploy tool No, relies on Roxy Yes, the Application Builder
- API Installation Script Yes, downloads latest MLJS and copies to your own webapp/Roxy app folder (mljsme.sh). Soon to be built in to Roxy too. No, manual download and install
Architecture ... ...
- Design Target NodeJS and Browser apps requiring all ML functionality Browser search applications only
- Technologies required to customise HTML, CSS, JavaScript only HTML, CSS, JavaScript, XQuery/XSLT, jQuery knowledge required
- Dependencies HighCharts for charting (forces need for jQuery), OpenLayers and Heatmaps for mapping HighCharts and jQuery 1.7.1, with jQuery UI 1.8, Heatmap.js, Mxn.js, Google Maps
- Optional library support Google Kratu, 960.css layout class support None
- Layout support Yes, via Workplace (Will also support layouts within layouts soon) Internal (define layout in Application Builder, or search context linking via parent html element), use HTML, CSS, XSLT
Extensibility ... ...
- Core API supported far too many to list now. All search API, including options, semantic graph manipulation and query, some admin functions, config functions, custom REST API extensions search, get only
Controllers per page Unlimited, supporting dashboard UIs Within specified parent container of page, configured by physical placement within parent div. Normally single controller per page (Singleton pattern)
- Core extensions Yes, via do() method, wraps all communication No, communicator object is internal only and not exposed for general use
- Widget extensions Yes, just use core mljs.js file, widgets css as base Yes, via ML.createWidget

##MLJS Versus Angular.js

I get asked a lot why I don't support jQuery or Angular.js. Simple answer is I don't provide (or enforce) any particular page controller or widget building library. I don't want to force a dependency on you, the developer/integrator, unless I absolutely have to.

It's not that I'm anti these libraries, just that I don't want to force people to use one or the other. You can still use them to create your own widgets, or manage a page that MLJS widgets are just a part of. This provides the best of both worlds - access to rich MLJS functionality with the ability to plug in any framework you like.

Angular.js is great for data binding apps. E.g. document creation and editing I can see a really good fit for Angular. Even for overarching page controllers it makes sense. I don't personally believe it makes sense for a search interface where you don't really bind data.

I also don't think it could elegantly handle the complex interrelationships that exist in a typical MarkLogic search page - with sorting, paging, facets etc. being affected by a range of activities. This will always require a middle tier app level controller like the Context objects in MLJS.

I think use Angular.js for data binding (document creation/editing) and an overall page Controller - but when it comes to visualisation widgets or inter widget communication, or communication with MarkLogic Server itself, use MLJS.