1
0
Fork 0

Remove RestEdgeHandler, start API-Changes-3.0.md Dokument.

This commit is contained in:
Max Neunhoeffer 2016-03-10 11:28:26 +01:00
parent 3ed256a478
commit 70772d6174
4 changed files with 84 additions and 249 deletions

84
API-Changes-3.0.md Normal file
View File

@ -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
<collection>.first() and <collection>.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. <collection>.first() and <collection>.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/<id>
"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.

View File

@ -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

View File

@ -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<std::string> const& suffix = _request->suffix();
if (!suffix.empty()) {
generateError(HttpResponse::BAD, TRI_ERROR_HTTP_SUPERFLUOUS_SUFFICES,
"superfluous suffix, expecting " + EDGE_PATH +
"?collection=<identifier>");
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=<identifier>&from=<from-handle>&to=<to-handle>");
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=<identifier>&from=<from-handle>&to=<to-handle>");
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=<identifier>");
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<VPackBuilder> 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;
}

View File

@ -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