diff --git a/API-Changes-3.0.md b/API-Changes-3.0.md new file mode 100644 index 0000000000..1b54ecc72c --- /dev/null +++ b/API-Changes-3.0.md @@ -0,0 +1,84 @@ +ArangoDB API changes for Version 3.0 +==================================== + +Overview +-------- + +### Breaking changes to existing API: + + 1. Cap-constraints are withdrawn + + 2. first() and last() are withdrawn + + .first() and .last() are withdrawn + + 3. Automatic creation of collections with first use + + 4. Pre Version 1.4 API compatibility withdrawn + + 5. Query-parameters "policy" and "rev" withdrawn in replace()/update() + + 6. /_api/edge withdrawn + +### New capabilities: + + 1. Babies for document queries. + + 2. _from and _to in edges can be changed. + + 3. _key, _from, _to can be indexed like normal attributes. + +Explanations +------------ + +### Breaking changes + + 1. Cap-constraints are withdrawn + + For 3.1 we plan to implement full MVCC and then at the latest it is + no longer well-defined what a cap constraint means. Furthermore, in + cluster mode it is really hard to implement as defined. + + 2. .first() and .last() are withdrawn + + Harmonization between single server and cluster. Cluster + implementation would be very difficult and inefficient. Even the + single server implementation simplifies without this (one doubly + linked list less) and saves memory. + + 3. Automatic creation of collections with first use + + Never worked in cluster, harmonization between single server and + cluster, In cluster would be undefined, since number of shards, + shard keys, replication factor and replication quorum would not be + specified. + + 4. Pre Version 1.4 API compatibility withdrawn + + 5. Query-parameters "policy" and "rev" withdrawn in PUT /_api/document/ + + "policy" was non-sensical (just do not specify "rev") + + 6. /_api/edge withdrawn + + Works now all over /_api/document + This is much cleaner and one can use the new baby-capabilities for + edges. Less code, drivers can be adjusted relatively easily by switching + to /_api/document. + + +### New capabilities: + + 1. Babies for document queries. + + Higher performance, necessary for synchronous replication, good for + clean API abstraction for transactions. + + 2. _from and _to in edges can be changed. + + Comes with the VelocyPack change. + + 3. _key, _from, _to can be indexed like normal attributes. + + Comes with the VelocyPack change. + diff --git a/arangod/CMakeLists.txt b/arangod/CMakeLists.txt index 02a0377465..9326b7ff68 100644 --- a/arangod/CMakeLists.txt +++ b/arangod/CMakeLists.txt @@ -185,7 +185,6 @@ add_executable(${BIN_ARANGOD} RestHandler/RestCursorHandler.cpp RestHandler/RestDebugHandler.cpp RestHandler/RestDocumentHandler.cpp - RestHandler/RestEdgeHandler.cpp RestHandler/RestEdgesHandler.cpp RestHandler/RestExportHandler.cpp RestHandler/RestImportHandler.cpp diff --git a/arangod/RestHandler/RestEdgeHandler.cpp b/arangod/RestHandler/RestEdgeHandler.cpp deleted file mode 100644 index d1cb25fd81..0000000000 --- a/arangod/RestHandler/RestEdgeHandler.cpp +++ /dev/null @@ -1,189 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// DISCLAIMER -/// -/// Copyright 2014-2016 ArangoDB GmbH, Cologne, Germany -/// Copyright 2004-2014 triAGENS GmbH, Cologne, Germany -/// -/// Licensed under the Apache License, Version 2.0 (the "License"); -/// you may not use this file except in compliance with the License. -/// You may obtain a copy of the License at -/// -/// http://www.apache.org/licenses/LICENSE-2.0 -/// -/// Unless required by applicable law or agreed to in writing, software -/// distributed under the License is distributed on an "AS IS" BASIS, -/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -/// See the License for the specific language governing permissions and -/// limitations under the License. -/// -/// Copyright holder is ArangoDB GmbH, Cologne, Germany -/// -/// @author Dr. Frank Celler -//////////////////////////////////////////////////////////////////////////////// - -#include "RestEdgeHandler.h" -#include "Rest/HttpRequest.h" -#include "Utils/SingleCollectionTransaction.h" -#include "Utils/StandaloneTransactionContext.h" -#include "VocBase/document-collection.h" - -using namespace arangodb; -using namespace arangodb::basics; -using namespace arangodb::rest; - -RestEdgeHandler::RestEdgeHandler(HttpRequest* request) - : RestDocumentHandler(request) {} - -//////////////////////////////////////////////////////////////////////////////// -/// @brief was docuBlock API_EDGE_CREATE -//////////////////////////////////////////////////////////////////////////////// - -bool RestEdgeHandler::createDocument() { - std::vector const& suffix = _request->suffix(); - - if (!suffix.empty()) { - generateError(HttpResponse::BAD, TRI_ERROR_HTTP_SUPERFLUOUS_SUFFICES, - "superfluous suffix, expecting " + EDGE_PATH + - "?collection="); - return false; - } - - // extract the from - bool found; - char const* from = _request->value("from", found); - if (!found || *from == '\0') { - generateError( - HttpResponse::BAD, TRI_ERROR_HTTP_BAD_PARAMETER, - "'from' is missing, expecting " + EDGE_PATH + - "?collection=&from=&to="); - return false; - } - - // extract the to - char const* to = _request->value("to", found); - - if (!found || *to == '\0') { - generateError( - HttpResponse::BAD, TRI_ERROR_HTTP_BAD_PARAMETER, - "'to' is missing, expecting " + EDGE_PATH + - "?collection=&from=&to="); - return false; - } - - // extract the cid - std::string const collection = _request->value("collection", found); - - if (!found || collection.empty()) { - generateError(HttpResponse::BAD, - TRI_ERROR_ARANGO_COLLECTION_PARAMETER_MISSING, - "'collection' is missing, expecting " + DOCUMENT_PATH + - "?collection="); - return false; - } - - /* TODO - if (!checkCreateCollection(collection, getCollectionType())) { - return false; - } - */ - - try { - bool parseSuccess = true; - // copy the default options - VPackOptions options = VPackOptions::Defaults; - options.keepTopLevelOpen = true; // We need to insert _from and _to - std::shared_ptr parsedBody = - parseVelocyPackBody(&options, parseSuccess); - - if (!parseSuccess) { - return false; - } - - if (!parsedBody->isOpenObject()) { - generateTransactionError(collection, - TRI_ERROR_ARANGO_DOCUMENT_TYPE_INVALID, ""); - return false; - } - - // Add _from and _to - parsedBody->add(TRI_VOC_ATTRIBUTE_FROM, VPackValue(from)); - parsedBody->add(TRI_VOC_ATTRIBUTE_TO, VPackValue(to)); - - parsedBody->close(); - - VPackSlice body = parsedBody->slice(); - - // find and load collection given by name or identifier - SingleCollectionTransaction trx(StandaloneTransactionContext::Create(_vocbase), - collection, TRI_TRANSACTION_WRITE); - - trx.addHint(TRI_TRANSACTION_HINT_SINGLE_OPERATION, false); - - int res = trx.begin(); - - if (res != TRI_ERROR_NO_ERROR) { - generateTransactionError(collection, res, ""); - return false; - } - - // TODO Test if is edge collection - /* - TRI_document_collection_t* document = trx.documentCollection(); - - if (document->_info.type() != TRI_COL_TYPE_EDGE) { - // check if we are inserting with the EDGE handler into a non-EDGE - // collection - generateError(HttpResponse::BAD, - TRI_ERROR_ARANGO_COLLECTION_TYPE_INVALID); - return false; - } - */ - - arangodb::OperationOptions opOptions; - opOptions.waitForSync = extractWaitForSync(); - - - arangodb::OperationResult result = trx.insert(collection, body, opOptions); - - - // Will commit if no error occured. - // or abort if an error occured. - // result stays valid! - res = trx.finish(result.code); - - if (result.failed()) { - // TODO correct errors for _from or _to invalid. - /* wrongPart is either from or to - if (res == TRI_ERROR_ARANGO_COLLECTION_NOT_FOUND) { - generateError(HttpResponse::NOT_FOUND, res, - wrongPart + " does not point to a valid collection"); - } else { - generateError(HttpResponse::BAD, res, - wrongPart + " is not a document handle"); - } - */ - generateTransactionError(collection, result.code, ""); - return false; - } - - if (res != TRI_ERROR_NO_ERROR) { - generateTransactionError(collection, res, ""); - return false; - } - - generateSaved(result, collection, TRI_COL_TYPE_EDGE); - - return true; - } catch (arangodb::basics::Exception const& ex) { - generateError(HttpResponse::responseCode(ex.code()), ex.code(), ex.what()); - } catch (std::bad_alloc const&) { - generateError(HttpResponse::SERVER_ERROR, TRI_ERROR_OUT_OF_MEMORY); - } catch (std::exception const& ex) { - generateError(HttpResponse::SERVER_ERROR, TRI_ERROR_INTERNAL, ex.what()); - } catch (...) { - generateError(HttpResponse::SERVER_ERROR, TRI_ERROR_INTERNAL); - } - // Only in error case - return false; -} - diff --git a/arangod/RestHandler/RestEdgeHandler.h b/arangod/RestHandler/RestEdgeHandler.h deleted file mode 100644 index 31d9c6458c..0000000000 --- a/arangod/RestHandler/RestEdgeHandler.h +++ /dev/null @@ -1,59 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// DISCLAIMER -/// -/// Copyright 2014-2016 ArangoDB GmbH, Cologne, Germany -/// Copyright 2004-2014 triAGENS GmbH, Cologne, Germany -/// -/// Licensed under the Apache License, Version 2.0 (the "License"); -/// you may not use this file except in compliance with the License. -/// You may obtain a copy of the License at -/// -/// http://www.apache.org/licenses/LICENSE-2.0 -/// -/// Unless required by applicable law or agreed to in writing, software -/// distributed under the License is distributed on an "AS IS" BASIS, -/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -/// See the License for the specific language governing permissions and -/// limitations under the License. -/// -/// Copyright holder is ArangoDB GmbH, Cologne, Germany -/// -/// @author Dr. Frank Celler -//////////////////////////////////////////////////////////////////////////////// - -#ifndef ARANGOD_REST_HANDLER_REST_EDGE_HANDLER_H -#define ARANGOD_REST_HANDLER_REST_EDGE_HANDLER_H 1 - -#include "Basics/Common.h" -#include "RestHandler/RestDocumentHandler.h" - -namespace arangodb { - -//////////////////////////////////////////////////////////////////////////////// -/// @brief collection request handler -//////////////////////////////////////////////////////////////////////////////// - -class RestEdgeHandler : public RestDocumentHandler { - public: - explicit RestEdgeHandler(rest::HttpRequest*); - - protected: - ////////////////////////////////////////////////////////////////////////////// - /// @brief get collection type - ////////////////////////////////////////////////////////////////////////////// - - TRI_col_type_e getCollectionType() const override final { - return TRI_COL_TYPE_EDGE; - } - - private: - ////////////////////////////////////////////////////////////////////////////// - /// @brief creates an edge - ////////////////////////////////////////////////////////////////////////////// - - bool createDocument() override final; - -}; -} - -#endif