
com.arangodb.internal.InternalArangoCollection Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of core Show documentation
Show all versions of core Show documentation
Core module for ArangoDB Java Driver
The newest version!
/*
* DISCLAIMER
*
* Copyright 2016 ArangoDB 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
*/
package com.arangodb.internal;
import com.arangodb.ArangoDBException;
import com.arangodb.entity.*;
import com.arangodb.internal.ArangoExecutor.ResponseDeserializer;
import com.arangodb.internal.util.DocumentUtil;
import com.arangodb.internal.util.RequestUtils;
import com.arangodb.model.*;
import com.arangodb.util.RawData;
import com.fasterxml.jackson.databind.JsonNode;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import static com.arangodb.internal.serde.SerdeUtils.constructParametricType;
/**
* @author Mark Vollmary
* @author Michele Rastelli
*/
public abstract class InternalArangoCollection extends ArangoExecuteable {
protected static final String PATH_API_COLLECTION = "/_api/collection";
private static final String COLLECTION = "collection";
private static final String PATH_API_DOCUMENT = "/_api/document";
private static final String PATH_API_INDEX = "/_api/index";
private static final String PATH_API_IMPORT = "/_api/import";
private static final String PATH_API_USER = "/_api/user";
private static final String MERGE_OBJECTS = "mergeObjects";
private static final String KEEP_NULL = "keepNull";
private static final String REFILL_INDEX_CACHES = "refillIndexCaches";
private static final String VERSION_ATTRIBUTE = "versionAttribute";
private static final String IGNORE_REVS = "ignoreRevs";
private static final String RETURN_NEW = "returnNew";
private static final String RETURN_OLD = "returnOld";
private static final String OVERWRITE = "overwrite";
private static final String OVERWRITE_MODE = "overwriteMode";
private static final String SILENT = "silent";
private static final String TRANSACTION_ID = "x-arango-trx-id";
protected final String dbName;
protected final String name;
protected InternalArangoCollection(final ArangoExecuteable executeable, final String dbName, final String name) {
super(executeable);
this.dbName = dbName;
this.name = name;
}
public String name() {
return name;
}
protected InternalRequest insertDocumentRequest(final T value, final DocumentCreateOptions options) {
final InternalRequest request = createInsertDocumentRequest(options);
request.setBody(getSerde().serializeUserData(value));
return request;
}
protected InternalRequest insertDocumentsRequest(final RawData values, final DocumentCreateOptions options) {
InternalRequest request = createInsertDocumentRequest(options);
request.setBody(getSerde().serialize(values));
return request;
}
protected InternalRequest insertDocumentsRequest(final Iterable values, final DocumentCreateOptions options) {
InternalRequest request = createInsertDocumentRequest(options);
request.setBody(getSerde().serializeCollectionUserData(values));
return request;
}
private InternalRequest createInsertDocumentRequest(final DocumentCreateOptions options) {
final DocumentCreateOptions params = (options != null ? options : new DocumentCreateOptions());
final InternalRequest request = request(dbName, RequestType.POST, PATH_API_DOCUMENT, name);
request.putQueryParam(ArangoRequestParam.WAIT_FOR_SYNC, params.getWaitForSync());
request.putQueryParam(RETURN_NEW, params.getReturnNew());
request.putQueryParam(RETURN_OLD, params.getReturnOld());
request.putQueryParam(SILENT, params.getSilent());
request.putQueryParam(OVERWRITE_MODE, params.getOverwriteMode() != null ?
params.getOverwriteMode().getValue() : null);
request.putQueryParam(MERGE_OBJECTS, params.getMergeObjects());
request.putQueryParam(KEEP_NULL, params.getKeepNull());
request.putQueryParam(REFILL_INDEX_CACHES, params.getRefillIndexCaches());
request.putQueryParam(VERSION_ATTRIBUTE, params.getVersionAttribute());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
return request;
}
protected ResponseDeserializer>> insertDocumentsResponseDeserializer(Class userDataClass) {
return (response) -> {
Type type = constructParametricType(MultiDocumentEntity.class,
constructParametricType(DocumentCreateEntity.class, userDataClass));
return getSerde().deserialize(response.getBody(), type);
};
}
protected InternalRequest importDocumentsRequest(final RawData values, final DocumentImportOptions options) {
return importDocumentsRequest(options).putQueryParam("type", ImportType.auto).setBody(getSerde().serialize(values));
}
protected InternalRequest importDocumentsRequest(final Iterable> values, final DocumentImportOptions options) {
return importDocumentsRequest(options).putQueryParam("type", ImportType.list)
.setBody(getSerde().serializeCollectionUserData(values));
}
protected InternalRequest importDocumentsRequest(final DocumentImportOptions options) {
final DocumentImportOptions params = options != null ? options : new DocumentImportOptions();
return request(dbName, RequestType.POST, PATH_API_IMPORT).putQueryParam(COLLECTION, name)
.putQueryParam(ArangoRequestParam.WAIT_FOR_SYNC, params.getWaitForSync())
.putQueryParam("fromPrefix", params.getFromPrefix()).putQueryParam("toPrefix", params.getToPrefix())
.putQueryParam(OVERWRITE, params.getOverwrite()).putQueryParam("onDuplicate", params.getOnDuplicate())
.putQueryParam("complete", params.getComplete()).putQueryParam("details", params.getDetails());
}
protected InternalRequest getDocumentRequest(final String key, final DocumentReadOptions options) {
final InternalRequest request = request(dbName, RequestType.GET, PATH_API_DOCUMENT,
DocumentUtil.createDocumentHandle(name, key));
final DocumentReadOptions params = (options != null ? options : new DocumentReadOptions());
request.putHeaderParam(ArangoRequestParam.IF_NONE_MATCH, params.getIfNoneMatch());
request.putHeaderParam(ArangoRequestParam.IF_MATCH, params.getIfMatch());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
if (Boolean.TRUE.equals(params.getAllowDirtyRead())) {
RequestUtils.allowDirtyRead(request);
}
return request;
}
protected ResponseDeserializer getDocumentResponseDeserializer(final Class type) {
return (response) -> getSerde().deserializeUserData(response.getBody(), type);
}
protected InternalRequest getDocumentsRequest(final Iterable keys, final DocumentReadOptions options) {
final DocumentReadOptions params = (options != null ? options : new DocumentReadOptions());
final InternalRequest request = request(dbName, RequestType.PUT, PATH_API_DOCUMENT, name)
.putQueryParam("onlyget", true)
.putHeaderParam(ArangoRequestParam.IF_NONE_MATCH, params.getIfNoneMatch())
.putHeaderParam(ArangoRequestParam.IF_MATCH, params.getIfMatch()).setBody(getSerde().serialize(keys))
.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
if (Boolean.TRUE.equals(params.getAllowDirtyRead())) {
RequestUtils.allowDirtyRead(request);
}
return request;
}
protected ResponseDeserializer> getDocumentsResponseDeserializer(final Class type) {
return (response) -> {
MultiDocumentEntity multiDocument = getSerde().deserialize(response.getBody(),
constructParametricType(MultiDocumentEntity.class, type));
boolean potentialDirtyRead = Boolean.parseBoolean(response.getMeta("X-Arango-Potential-Dirty-Read"));
multiDocument.setPotentialDirtyRead(potentialDirtyRead);
return multiDocument;
};
}
protected InternalRequest replaceDocumentRequest(
final String key, final T value, final DocumentReplaceOptions options) {
final InternalRequest request = createReplaceDocumentRequest(options, DocumentUtil.createDocumentHandle(name, key));
request.setBody(getSerde().serializeUserData(value));
return request;
}
protected InternalRequest replaceDocumentsRequest(final Iterable values, final DocumentReplaceOptions options) {
final InternalRequest request = createReplaceDocumentRequest(options, name);
request.setBody(getSerde().serializeCollectionUserData(values));
return request;
}
protected InternalRequest replaceDocumentsRequest(final RawData values, final DocumentReplaceOptions options) {
final InternalRequest request = createReplaceDocumentRequest(options, name);
request.setBody(getSerde().serialize(values));
return request;
}
private InternalRequest createReplaceDocumentRequest(final DocumentReplaceOptions options, String path) {
final DocumentReplaceOptions params = (options != null ? options : new DocumentReplaceOptions());
final InternalRequest request = request(dbName, RequestType.PUT, PATH_API_DOCUMENT, path);
request.putHeaderParam(ArangoRequestParam.IF_MATCH, params.getIfMatch());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
request.putQueryParam(ArangoRequestParam.WAIT_FOR_SYNC, params.getWaitForSync());
request.putQueryParam(IGNORE_REVS, params.getIgnoreRevs());
request.putQueryParam(RETURN_NEW, params.getReturnNew());
request.putQueryParam(RETURN_OLD, params.getReturnOld());
request.putQueryParam(SILENT, params.getSilent());
request.putQueryParam(REFILL_INDEX_CACHES, params.getRefillIndexCaches());
request.putQueryParam(VERSION_ATTRIBUTE, params.getVersionAttribute());
return request;
}
protected ResponseDeserializer>> replaceDocumentsResponseDeserializer(
final Class returnType) {
return (response) -> {
Type type = constructParametricType(MultiDocumentEntity.class,
constructParametricType(DocumentUpdateEntity.class, returnType));
return getSerde().deserialize(response.getBody(), type);
};
}
protected InternalRequest updateDocumentRequest(final String key, final T value, final DocumentUpdateOptions options) {
final InternalRequest request = createUpdateDocumentRequest(options, DocumentUtil.createDocumentHandle(name, key));
request.setBody(getSerde().serializeUserData(value));
return request;
}
protected InternalRequest updateDocumentsRequest(final Iterable values, final DocumentUpdateOptions options) {
final InternalRequest request = createUpdateDocumentRequest(options, name);
request.setBody(getSerde().serializeCollectionUserData(values));
return request;
}
protected InternalRequest updateDocumentsRequest(final RawData values, final DocumentUpdateOptions options) {
final InternalRequest request = createUpdateDocumentRequest(options, name);
request.setBody(getSerde().serialize(values));
return request;
}
private InternalRequest createUpdateDocumentRequest(final DocumentUpdateOptions options, String path) {
final DocumentUpdateOptions params = (options != null ? options : new DocumentUpdateOptions());
final InternalRequest request = request(dbName, RequestType.PATCH, PATH_API_DOCUMENT, path);
request.putHeaderParam(ArangoRequestParam.IF_MATCH, params.getIfMatch());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
request.putQueryParam(ArangoRequestParam.KEEP_NULL, params.getKeepNull());
request.putQueryParam(ArangoRequestParam.WAIT_FOR_SYNC, params.getWaitForSync());
request.putQueryParam(MERGE_OBJECTS, params.getMergeObjects());
request.putQueryParam(IGNORE_REVS, params.getIgnoreRevs());
request.putQueryParam(RETURN_NEW, params.getReturnNew());
request.putQueryParam(RETURN_OLD, params.getReturnOld());
request.putQueryParam(SILENT, params.getSilent());
request.putQueryParam(REFILL_INDEX_CACHES, params.getRefillIndexCaches());
request.putQueryParam(VERSION_ATTRIBUTE, params.getVersionAttribute());
return request;
}
protected ResponseDeserializer>> updateDocumentsResponseDeserializer(
final Class returnType) {
return (response) -> {
Type type = constructParametricType(MultiDocumentEntity.class,
constructParametricType(DocumentUpdateEntity.class, returnType));
return getSerde().deserialize(response.getBody(), type);
};
}
protected InternalRequest deleteDocumentRequest(final String key, final DocumentDeleteOptions options) {
return createDeleteDocumentRequest(options, DocumentUtil.createDocumentHandle(name, key));
}
protected InternalRequest deleteDocumentsRequest(final Iterable docs, final DocumentDeleteOptions options) {
final InternalRequest request = createDeleteDocumentRequest(options, name);
request.setBody(getSerde().serializeCollectionUserData(docs));
return request;
}
protected InternalRequest deleteDocumentsRequest(final RawData docs, final DocumentDeleteOptions options) {
final InternalRequest request = createDeleteDocumentRequest(options, name);
request.setBody(getSerde().serialize(docs));
return request;
}
private InternalRequest createDeleteDocumentRequest(final DocumentDeleteOptions options, String path) {
final DocumentDeleteOptions params = (options != null ? options : new DocumentDeleteOptions());
final InternalRequest request = request(dbName, RequestType.DELETE, PATH_API_DOCUMENT, path);
request.putHeaderParam(ArangoRequestParam.IF_MATCH, params.getIfMatch());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
request.putQueryParam(ArangoRequestParam.WAIT_FOR_SYNC, params.getWaitForSync());
request.putQueryParam(RETURN_OLD, params.getReturnOld());
request.putQueryParam(SILENT, params.getSilent());
request.putQueryParam(REFILL_INDEX_CACHES, params.getRefillIndexCaches());
request.putQueryParam(IGNORE_REVS, params.getIgnoreRevs());
return request;
}
protected ResponseDeserializer>> deleteDocumentsResponseDeserializer(
final Class userDataClass) {
return (response) -> {
Type type = constructParametricType(MultiDocumentEntity.class,
constructParametricType(DocumentDeleteEntity.class, userDataClass));
return getSerde().deserialize(response.getBody(), type);
};
}
protected InternalRequest documentExistsRequest(final String key, final DocumentExistsOptions options) {
final InternalRequest request = request(dbName, RequestType.HEAD, PATH_API_DOCUMENT,
DocumentUtil.createDocumentHandle(name, key));
final DocumentExistsOptions params = (options != null ? options : new DocumentExistsOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
request.putHeaderParam(ArangoRequestParam.IF_MATCH, params.getIfMatch());
request.putHeaderParam(ArangoRequestParam.IF_NONE_MATCH, params.getIfNoneMatch());
return request;
}
protected InternalRequest getIndexRequest(final String id) {
return request(dbName, RequestType.GET, PATH_API_INDEX, createIndexId(id));
}
protected InternalRequest deleteIndexRequest(final String id) {
return request(dbName, RequestType.DELETE, PATH_API_INDEX, createIndexId(id));
}
protected ResponseDeserializer deleteIndexResponseDeserializer() {
return (response) -> getSerde().deserialize(response.getBody(), "/id", String.class);
}
private String createIndexId(final String id) {
final String index;
if (id.matches(DocumentUtil.REGEX_ID)) {
index = id;
} else if (id.matches(DocumentUtil.REGEX_KEY)) {
index = name + "/" + id;
} else {
throw new ArangoDBException(String.format("index id %s is not valid.", id));
}
return index;
}
protected InternalRequest createPersistentIndexRequest(
final Iterable fields, final PersistentIndexOptions options) {
final InternalRequest request = request(dbName, RequestType.POST, PATH_API_INDEX);
request.putQueryParam(COLLECTION, name);
request.setBody(getSerde().serialize(
OptionsBuilder.build(options != null ? options : new PersistentIndexOptions(), fields)));
return request;
}
protected InternalRequest createInvertedIndexRequest(final InvertedIndexOptions options) {
final InternalRequest request = request(dbName, RequestType.POST, PATH_API_INDEX);
request.putQueryParam(COLLECTION, name);
request.setBody(getSerde().serialize(options));
return request;
}
protected InternalRequest createGeoIndexRequest(final Iterable fields, final GeoIndexOptions options) {
final InternalRequest request = request(dbName, RequestType.POST, PATH_API_INDEX);
request.putQueryParam(COLLECTION, name);
request.setBody(
getSerde().serialize(OptionsBuilder.build(options != null ? options : new GeoIndexOptions(), fields)));
return request;
}
@Deprecated
protected InternalRequest createFulltextIndexRequest(final Iterable fields, final FulltextIndexOptions options) {
final InternalRequest request = request(dbName, RequestType.POST, PATH_API_INDEX);
request.putQueryParam(COLLECTION, name);
request.setBody(
getSerde().serialize(OptionsBuilder.build(options != null ? options : new FulltextIndexOptions(),
fields)));
return request;
}
protected InternalRequest createTtlIndexRequest(final Iterable fields, final TtlIndexOptions options) {
final InternalRequest request = request(dbName, RequestType.POST, PATH_API_INDEX);
request.putQueryParam(COLLECTION, name);
request.setBody(
getSerde().serialize(OptionsBuilder.build(options != null ? options : new TtlIndexOptions(), fields)));
return request;
}
protected InternalRequest createZKDIndexRequest(
final Iterable fields, final ZKDIndexOptions options) {
final InternalRequest request = request(dbName, RequestType.POST, PATH_API_INDEX);
request.putQueryParam(COLLECTION, name);
request.setBody(getSerde().serialize(OptionsBuilder.build(options != null ? options :
new ZKDIndexOptions().fieldValueTypes(ZKDIndexOptions.FieldValueTypes.DOUBLE), fields)));
return request;
}
protected InternalRequest createMDIndexRequest(
final Iterable fields, final AbstractMDIndexOptions> options) {
final InternalRequest request = request(dbName, RequestType.POST, PATH_API_INDEX);
request.putQueryParam(COLLECTION, name);
AbstractMDIndexOptions> opts = options != null ? options : new MDIndexOptions().fieldValueTypes(MDIFieldValueTypes.DOUBLE);
request.setBody(getSerde().serialize(OptionsBuilder.build(opts, fields)));
return request;
}
protected InternalRequest getIndexesRequest() {
final InternalRequest request = request(dbName, RequestType.GET, PATH_API_INDEX);
request.putQueryParam(COLLECTION, name);
return request;
}
protected ResponseDeserializer> getIndexesResponseDeserializer() {
return (response) -> {
Collection indexes = new ArrayList<>();
for (JsonNode idx : getSerde().parse(response.getBody(), "/indexes")) {
if (!"inverted".equals(idx.get("type").textValue())) {
indexes.add(getSerde().deserialize(idx, IndexEntity.class));
}
}
return indexes;
};
}
protected ResponseDeserializer> getInvertedIndexesResponseDeserializer() {
return (response) -> {
Collection indexes = new ArrayList<>();
for (JsonNode idx : getSerde().parse(response.getBody(), "/indexes")) {
if ("inverted".equals(idx.get("type").textValue())) {
indexes.add(getSerde().deserialize(idx, InvertedIndexEntity.class));
}
}
return indexes;
};
}
protected InternalRequest truncateRequest(final CollectionTruncateOptions options) {
final InternalRequest request = request(dbName, RequestType.PUT, PATH_API_COLLECTION, name, "truncate");
final CollectionTruncateOptions params = (options != null ? options : new CollectionTruncateOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
return request;
}
protected InternalRequest countRequest(final CollectionCountOptions options) {
final InternalRequest request = request(dbName, RequestType.GET, PATH_API_COLLECTION, name, "count");
final CollectionCountOptions params = (options != null ? options : new CollectionCountOptions());
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
return request;
}
protected InternalRequest dropRequest(final Boolean isSystem) {
return request(dbName, RequestType.DELETE, PATH_API_COLLECTION, name).putQueryParam("isSystem", isSystem);
}
protected InternalRequest getInfoRequest() {
return request(dbName, RequestType.GET, PATH_API_COLLECTION, name);
}
protected InternalRequest getPropertiesRequest() {
return request(dbName, RequestType.GET, PATH_API_COLLECTION, name, "properties");
}
protected InternalRequest changePropertiesRequest(final CollectionPropertiesOptions options) {
final InternalRequest request = request(dbName, RequestType.PUT, PATH_API_COLLECTION, name, "properties");
request.setBody(getSerde().serialize(options != null ? options : new CollectionPropertiesOptions()));
return request;
}
protected InternalRequest renameRequest(final String newName) {
final InternalRequest request = request(dbName, RequestType.PUT, PATH_API_COLLECTION, name, "rename");
request.setBody(getSerde().serialize(OptionsBuilder.build(new CollectionRenameOptions(), newName)));
return request;
}
protected InternalRequest responsibleShardRequest(final T value) {
final InternalRequest request = request(dbName, RequestType.PUT, PATH_API_COLLECTION, name, "responsibleShard");
request.setBody(getSerde().serializeUserData(value));
return request;
}
protected InternalRequest getRevisionRequest() {
return request(dbName, RequestType.GET, PATH_API_COLLECTION, name, "revision");
}
protected InternalRequest grantAccessRequest(final String user, final Permissions permissions) {
return request(ArangoRequestParam.SYSTEM, RequestType.PUT, PATH_API_USER, user, ArangoRequestParam.DATABASE,
dbName, name).setBody(getSerde().serialize(OptionsBuilder.build(new UserAccessOptions(),
permissions)));
}
protected InternalRequest resetAccessRequest(final String user) {
return request(ArangoRequestParam.SYSTEM, RequestType.DELETE, PATH_API_USER, user, ArangoRequestParam.DATABASE,
dbName, name);
}
protected InternalRequest getPermissionsRequest(final String user) {
return request(ArangoRequestParam.SYSTEM, RequestType.GET, PATH_API_USER, user, ArangoRequestParam.DATABASE,
dbName, name);
}
protected ResponseDeserializer getPermissionsResponseDeserialzer() {
return (response) -> getSerde().deserialize(response.getBody(), ArangoResponseField.RESULT_JSON_POINTER,
Permissions.class);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy