1
0
Fork 0
arangodb/Documentation/Books/Users/NewFeatures/NewFeatures24.mdpp

289 lines
11 KiB
Plaintext

!CHAPTER Features and Improvements
The following list shows in detail which features have been added or improved in
ArangoDB 2.4. ArangoDB 2.4 also contains several bugfixes that are not listed
here. For a list of bugfixes, please consult the [CHANGELOG](https://github.com/arangodb/arangodb/blob/devel/CHANGELOG).
!SECTION V8 version upgrade
The built-in version of V8 has been upgraded from 3.16.14 to 3.29.59.
This activates several ES6 (also dubbed *Harmony* or *ES.next*) features in
ArangoDB, both in the ArangoShell and the ArangoDB server. They can be
used for scripting and in server-side actions such as Foxx routes, traversals
etc.
The following ES6 features are available in ArangoDB 2.4 by default:
* iterators
* the `of` operator
* symbols
* predefined collections types (Map, Set etc.)
* typed arrays
Many other ES6 features are disabled by default, but can be made available by
starting arangod or arangosh with the appropriate options:
* arrow functions
* proxies
* generators
* String, Array, and Number enhancements
* constants
* enhanced object and numeric literals
To activate all these ES6 features in arangod or arangosh, start it with
the following options:
arangosh --javascript.v8-options="--harmony --harmony_generators"
More details on the available ES6 features can be found in
[this blog](https://jsteemann.github.io/blog/2014/12/19/using-es6-features-in-arangodb/).
!SECTION FoxxGenerator
ArangoDB 2.4 is shipped with FoxxGenerator, a framework for building
standardized Hypermedia APIs easily. The generated APIs can be consumed with
client tools that understand [Siren](https://github.com/kevinswiber/siren).
Hypermedia is the simple idea that our HTTP APIs should have links between their
endpoints in the same way that our web sites have links between
them. FoxxGenerator is based on the idea that you can represent an API as a
statechart: Every endpoint is a state and the links are the transitions between
them. Using your description of states and transitions, it can then create an
API for you.
The FoxxGenerator can create APIs based on a semantic description of entities
and transitions. A blog series on the use cases and how to use the Foxx generator
is here:
* [part 1](https://www.arangodb.com/2014/11/26/building-hypermedia-api-json)
* [part 2](https://www.arangodb.com/2014/12/02/building-hypermedia-apis-design)
* [part 3](https://www.arangodb.com/2014/12/08/building-hypermedia-apis-foxxgenerator)
A cookbook recipe for getting started with FoxxGenerator is [here](https://docs.arangodb.com/cookbook/FoxxGeneratorFirstSteps.html).
!SECTION AQL improvements
!SUBSECTION Optimizer improvements
The AQL optimizer has been enhanced to use of indexes in queries in several
additional cases. Filters containing the `IN` operator can now make use of
indexes, and multiple OR- or AND-combined filter conditions can now also use
indexes if the filter conditions refer to the same indexed attribute.
Here are a few examples of queries that can now use indexes but couldn't before:
FOR doc IN collection
FILTER doc.indexedAttribute == 1 || doc.indexedAttribute > 99
RETURN doc
FOR doc IN collection
FILTER doc.indexedAttribute IN [ 3, 42 ] || doc.indexedAttribute > 99
RETURN doc
FOR doc IN collection
FILTER (doc.indexedAttribute > 2 && doc.indexedAttribute < 10) ||
(doc.indexedAttribute > 23 && doc.indexedAttribute < 42)
RETURN doc
Additionally, the optimizer rule `remove-filter-covered-by-index` has been
added. This rule removes FilterNodes and CalculationNodes from an execution
plan if the filter condition is already covered by a previous IndexRangeNode.
Removing the filter's CalculationNode and the FilterNode itself will speed
up query execution because the query requires less computation.
Furthermore, the new optimizer rule `remove-sort-rand` will remove a `SORT RAND()`
statement and move the random iteration into the appropriate `EnumerateCollectionNode`.
This is usually more efficient than individually enumerating and sorting.
!SUBSECTION Data-modification queries returning documents
`INSERT`, `REMOVE`, `UPDATE` or `REPLACE` queries now can optionally return
the documents inserted, removed, updated, or replaced. This is helpful for tracking
the auto-generated attributes (e.g. `_key`, `_rev`) created by an `INSERT` and in
a lot of other situations.
In order to return documents from a data-modification query, the statement must
immediately be immediately followed by a `LET` statement that assigns either the
pseudo-value `NEW` or `OLD` to a variable. This `LET` statement must be followed
by a `RETURN` statement that returns the variable introduced by `LET`:
FOR i IN 1..100
INSERT { value: i } IN test LET inserted = NEW RETURN inserted
FOR u IN users
FILTER u.status == 'deleted'
REMOVE u IN users LET removed = OLD RETURN removed
FOR u IN users
FILTER u.status == 'not active'
UPDATE u WITH { status: 'inactive' } IN users LET updated = NEW RETURN updated
`NEW` refers to the inserted or modified document revision, and `OLD` refers
to the document revision before update or removal. `INSERT` statements can
only refer to the `NEW` pseudo-value, and `REMOVE` operations only to `OLD`.
`UPDATE` and `REPLACE` can refer to either.
In all cases the full documents will be returned with all their attributes,
including the potentially auto-generated attributes such as `_id`, `_key`, or `_rev`
and the attributes not specified in the update expression of a partial update.
!SUBSECTION Language improvements
!SUBSUBSECTION `COUNT` clause
An optional `COUNT` clause was added to the `COLLECT` statement. The `COUNT`
clause allows for more efficient counting of values.
In previous versions of ArangoDB one had to write the following to count
documents:
RETURN LENGTH (
FOR doc IN collection
FILTER ...some condition...
RETURN doc
)
With the `COUNT` clause, the query can be modified to
FOR doc IN collection
FILTER ...some condition...
COLLECT WITH COUNT INTO length
RETURN length
The latter query will be much more efficient because it will not produce any
intermediate results with need to be shipped from a subquery into the `LENGTH`
function.
The `COUNT` clause can also be used to count the number of items in each group:
FOR doc IN collection
FILTER ...some condition...
COLLECT group = doc.group WITH COUNT INTO length
return { group: group, length: length }
!SUBSUBSECTION `COLLECT` modifications
In ArangoDB 2.4, `COLLECT` operations can be made more efficient if only a
small fragment of the group values is needed later. For these cases, `COLLECT`
provides an optional conversion expression for the `INTO` clause. This
expression controls the value that is inserted into the array of group values.
It can be used for projections.
The following query only copies the `dateRegistered` attribute of each document
into the groups, potentially saving a lot of memory and computation time
compared to copying `doc` completely:
FOR doc IN collection
FILTER ...some condition...
COLLECT group = doc.group INTO dates = doc.dateRegistered
return { group: group, maxDate: MAX(dates) }
Compare this to the following variant of the query, which was the only way
to achieve the same result in previous versions of ArangoDB:
FOR doc IN collection
FILTER ...some condition...
COLLECT group = doc.group INTO dates
return { group: group, maxDate: MAX(dates[*].doc.dateRegistered) }
The above query will need to copy the full `doc` attribute into the `lengths`
variable, whereas the new variant will only copy the `dateRegistered`
attribute of each `doc`.
!SUBSUBSECTION Subquery syntax
In previous versions of ArangoDB, subqueries required extra parentheses
around them, and this caused confusion when subqueries were used as function
parameters. For example, the following query did not work:
LET values = LENGTH(
FOR doc IN collection RETURN doc
)
but had to be written as follows:
LET values = LENGTH((
FOR doc IN collection RETURN doc
))
This was unintuitive and is fixed in version 2.4 so that both variants of
the query are accepted and produce the same result.
!SUBSECTION Web interface
The `Applications` tab for Foxx applications in the web interface has got
a complete redesign.
It will now only show applications that are currently running in ArangoDB.
For a selected application, a new detailed view has been created. This view
provides a better overview of the app, e.g.:
* author
* license
* version
* contributors
* download links
* API documentation
Installing a new Foxx application on the server is made easy using the new
`Add application` button. The `Add application` dialogue provides all the
features already available in the `foxx-manager` console application plus some more:
* install a Foxx application from Github
* install a Foxx application from a zip file
* install a Foxx application from ArangoDB's application store
* create a new Foxx application from scratch: this feature uses a generator to
create a Foxx application with pre-defined CRUD methods for a given list of collections.
The generated Foxx app can either be downloaded as a zip file or
be installed on the server. Starting with a new Foxx app has never been easier.
!SECTION Miscellaneous improvements
!SUBSECTION Default endpoint is 127.0.0.1
The default endpoint for the ArangoDB server has been changed from `0.0.0.0` to
`127.0.0.1`. This will make new ArangoDB installations unaccessible from clients other
than localhost unless the configuration is changed. This is a security precaution
measure that has been requested as a feature a lot of times.
If you are the development option `--enable-relative`, the endpoint will still
be `0.0.0.0`.
!SUBSECTION System collections in replication
By default, system collections are now included in replication and all replication API
return values. This will lead to user accounts and credentials data being replicated
from master to slave servers. This may overwrite slave-specific database users.
If this is undesired, the `_users` collection can be excluded from replication
easily by setting the `includeSystem` attribute to `false` in the following commands:
* replication.sync({ includeSystem: false });
* replication.applier.properties({ includeSystem: false });
This will exclude all system collections (including `_aqlfunctions`, `_graphs` etc.)
from the initial synchronisation and the continuous replication.
If this is also undesired, it is also possible to specify a list of collections to
exclude from the initial synchronisation and the continuous replication using the
`restrictCollections` attribute, e.g.:
```js
require("org/arangodb/replication").applier.properties({
includeSystem: true,
restrictType: "exclude",
restrictCollections: [ "_users", "_graphs", "foo" ]
});
```