Incompatible changes in ArangoDB 2.5
It is recommended to check the following list of incompatible changes before upgrading to ArangoDB 2.5, and adjust any client programs if necessary.
Changed behavior
V8
The V8 version shipped with ArangoDB was upgraded from 3.29.59 to 3.31.74.1. This leads to additional ECMAScript 6 (ES6 or “harmony”) features being enabled by default in ArangoDB’s scripting environment.
Apart from that, a change in the interpretation of command-line options by V8 may
affect users. ArangoDB passes the value of the command-line option --javascript.v8-options
to V8 and leaves interpretation of the contents to V8. For example, the ArangoDB option
--javascript.v8-options="--harmony"
could be used to tell V8 to enable its harmony
features.
In ArangoDB 2.4, the following harmony options were made available by V8:
- --harmony_scoping (enable harmony block scoping)
- --harmony_modules (enable harmony modules (implies block scoping))
- --harmony_proxies (enable harmony proxies)
- --harmony_generators (enable harmony generators)
- --harmony_numeric_literals (enable harmony numeric literals (0o77, 0b11))
- --harmony_strings (enable harmony string)
- --harmony_arrays (enable harmony arrays)
- --harmony_arrow_functions (enable harmony arrow functions)
- --harmony_classes (enable harmony classes)
- --harmony_object_literals (enable harmony object literal extensions)
- --harmony (enable all harmony features (except proxies))
There was the option --harmony
, which turned on almost all harmony features.
In ArangoDB 2.5, V8 provides the following harmony-related options:
- --harmony (enable all completed harmony features)
- --harmony_shipping (enable all shipped harmony features)
- --harmony_modules (enable “harmony modules (implies block scoping)” (in progress))
- --harmony_arrays (enable “harmony array methods” (in progress))
- --harmony_array_includes (enable “harmony Array.prototype.includes” (in progress))
- --harmony_regexps (enable “harmony regular expression extensions” (in progress))
- --harmony_arrow_functions (enable “harmony arrow functions” (in progress))
- --harmony_proxies (enable “harmony proxies” (in progress))
- --harmony_sloppy (enable “harmony features in sloppy mode” (in progress))
- --harmony_unicode (enable “harmony unicode escapes” (in progress))
- --harmony_tostring (enable “harmony toString”)
- --harmony_numeric_literals (enable “harmony numeric literals”)
- --harmony_strings (enable “harmony string methods”)
- --harmony_scoping (enable “harmony block scoping”)
- --harmony_classes (enable “harmony classes (implies block scoping & object literal extension)”)
- --harmony_object_literals (enable “harmony object literal extensions”)
- --harmony_templates (enable “harmony template literals”)
Note that there are extra options for better controlling the dedicated features,
and especially that the meaning of the --harmony
option has changed from enabling
all harmony features to all completed harmony features!
Users should adjust the value of --javascript.v8-options
accordingly.
Please note that incomplete harmony features are subject to change in future V8 releases.
Sparse indexes
Hash indexes and skiplist indexes can now be created in a sparse variant.
When not explicitly set, the sparse
attribute defaults to false
for new indexes.
This causes a change in behavior when creating a unique hash index without specifying the sparse flag. The unique hash index will be created in a non-sparse variant in ArangoDB 2.5.
In 2.4 and before, unique hash indexes were implicitly sparse, always excluding null
values
from the index. There was no option to control this behavior, and sparsity was neither supported
for non-unique hash indexes nor skiplists in 2.4. This implicit sparsity of just unique hash
indexes was considered an inconsistency, and therefore the behavior was cleaned up in 2.5.
As of 2.5, hash and skiplist indexes will only be created sparse if sparsity is explicitly requested.
This may require a change in index-creating client code, but only if the client code creates
unique hash indexes and if they are still intended to be sparse. In this case, the client code
should explicitly set the sparse
flag to true
when creating a unique hash index.
Existing unique hash indexes from 2.4 or before will automatically be migrated so they are still
sparse after the upgrade to 2.5. For these indexes, the sparse
attribute will be populated
automatically with a value of true
.
Geo indexes are implicitly sparse, meaning documents without the indexed location attribute or
containing invalid location coordinate values will be excluded from the index automatically. This
is also a change when compared to pre-2.5 behavior, when documents with missing or invalid
coordinate values may have caused errors on insertion when the geo index’ unique
flag was set
and its ignoreNull
flag was not.
This was confusing and has been rectified in 2.5. The method ensureGeoConstraint()
now does the
same as ensureGeoIndex()
. Furthermore, the attributes constraint
, unique
, ignoreNull
and
sparse
flags are now completely ignored when creating geo indexes. Client index creation code
therefore does not need to set the ignoreNull
or constraint
attributes when creating a geo
index.
The same is true for fulltext indexes. There is no need to specify non-uniqueness or sparsity for geo or fulltext indexes. They will always be non-unique and sparse.
Moved Foxx applications to a different folder.
Until 2.4 Foxx apps were stored in the following folder structure:
<app-path>/databases/<dbname>/<appname>:<appversion>
.
This caused some trouble as apps where cached based on name and version and updates did not apply.
Also the path on filesystem and the app’s access URL had no relation to one another.
Now the path on filesystem is identical to the URL (except the appended APP):
<app-path>/_db/<dbname>/<mountpoint>/APP
Foxx Development mode
The development mode used until 2.4 is gone. It has been replaced by a much more mature version. This includes the deprecation of the javascript.dev-app-path parameter, which is useless since 2.5. Instead of having two separate app directories for production and development, apps now reside in one place, which is used for production as well as for development. Apps can still be put into development mode, changing their behavior compared to production mode. Development mode apps are still reread from disk at every request, and still they ship more debug output.
This change has also made the startup options --javascript.frontend-development-mode
and
--javascript.dev-app-path
obsolete. The former option will not have any effect when set, and the
latter option is only read and used during the upgrade to 2.5 and does not have any effects later.
Foxx install process
Installing Foxx apps has been a two step process: import them into ArangoDB and mount them at a specific mount point. These operations have been joined together. You can install an app at one mount point, that’s it. No fetch, mount, unmount, purge cycle anymore. The commands have been simplified to just:
- install: get your Foxx app up and running
- uninstall: shut it down and erase it from disk
Deprecated features
- Foxx: method
Model#toJSONSchema(id)
is deprecated, it will raise a warning if you use it. Please useFoxx.toJSONSchema(id, model)
instead.
Removed features
- Startup switch
--javascript.frontend-development-mode
: Its major purpose was internal development anyway. Now the web frontend can be set to development mode similar to any other Foxx app. - Startup switch
--javascript.dev-app-path
: Was used for the development mode of Foxx. This is integrated with the normal app-path now and can be triggered on app level. The second app-path is superfluous. - Foxx:
controller.collection
: Please useappContext.collection
instead. - Foxx:
FoxxRepository.modelPrototype
: Please useFoxxRepository.model
instead. - Foxx:
Model.extend({}, {attributes: {}})
: Please useModel.extend({schema: {}})
instead. - Foxx:
requestContext.bodyParam(paramName, description, Model)
: Please userequestContext.bodyParam(paramName, options)
instead. - Foxx:
requestContext.queryParam({type: string})
: Please userequestContext.queryParam({type: joi})
instead. - Foxx:
requestContext.pathParam({type: string})
: Please userequestContext.pathParam({type: joi})
instead. - Graph: The modules
org/arangodb/graph
andorg/arangodb/graph-blueprint
: Please use moduleorg/arangodb/general-graph
instead. NOTE: This does not mean we do not support blueprints any more. General graph covers everything the graph--blueprint did, plus many more features. - General-Graph: In the module
org/arangodb/general-graph
the functions_undirectedRelation
and_directedRelation
are no longer available. Both functions have been unified to_relation
.