Преглед изворни кода

agDocuments.erl 改进调整

erlArango_v1
AICells пре 5 година
родитељ
комит
7fd6a422bb
1 измењених фајлова са 186 додато и 77 уклоњено
  1. +186
    -77
      src/agApi/agDocuments.erl

+ 186
- 77
src/agApi/agDocuments.erl Прегледај датотеку

@ -6,34 +6,113 @@
-compile([export_all, nowarn_export_all]).
%% doc_address:https://www.arangodb.com/docs/stable/http/document.html
% HTTP接口
%
%
% ArangoDB中的文档是JSON对象
%
% {
% "_id" : "myusers/3456789",
% "_key" : "3456789",
% "_rev" : "14253647",
% "firstName" : "John",
% "lastName" : "Doe",
% "address" : {
% "street" : "Road To Nowhere 1",
% "city" : "Gotham"
% },
% "hobbies" : [
% {"name": "swimming", "howFavorite": 10},
% {"name": "biking", "howFavorite": 6},
% {"name": "programming", "howFavorite": 4}
% ]
% }
% _id _key _rev_key创建文档时_id_key值是不可变的_rev值由ArangoDB自动维护
%
% _key属性/
%
%
% 使_key每个文档的属性中ArangoDB自动在集合的主索引中建立索引_key值是不变的_key属性ArangoDB将自动生成文档密钥使_key
%
% 使keyOptions属性创建集合
%
% 使keyOptions它可以完全禁止用户指定的键使_key
%
%
% ArangoDB中的每个文档都有一个修订版本system属性中 _rev
%
% _rev值在单个服务器设置中的所有文档和所有集合中都是唯一的_rev即使在同一毫秒内编写
%
% _rev属性可以用作查询的前提 _rev属性
%
% ArangoDB会将该文档的新版本写入预写日志文件
%
% _key存在同一文档的多个修订版访使
%
% _key_rev值恢复文档的旧版本
%
%
% ArangoDB尝试尽可能遵守现有的HTTP标准HTTP标头Etag设置为使用双引号括起来的文档修订版
%
% HTTP方法POSTGET HEADPUTPATCH和DELETE
%
% 使 使HTTP方法HEAD检查文档的修订
%
%
% ArangoDB 3.0API已扩展为不仅可以处理单个文档HTTP协议的开销以及客户端和服务器之间的各个网络往返使JSON对象数组代替单个文档API描述
%
% GETHEAD和DELETE HTTP操作通常不允许传递消息正文
%
% URI
% 使URI检索任何文档
%
% http://server:port/_api/document/<document-handle>
% demo/362549736URL为
%
% http://localhost:8529/_api/document/demo/362549736
% URL架构未明确指定 _system将使用默认数据库使URL模式
%
% http://server:port/_db/<database-name>/_api/document/<document-handle>
%
%
% http://localhost:8529/_db/mydb/_api/document/demo/362549736
% 使URL格式
%
% Etag HTTP标头中返回
%
% 使GET获取文档使If-None-Match标头HTTP 412
%
% 使If-Match标头HTTP 412
%
% GET /_api/document/{collection}/{key}
%
%
%
% collection
% key
%
% If-None-Match If-None-MatchEtagEtag不同HTTP 304
% If-Match If-MatchEtagEtag相同HTTP 412
% If-None-Match If-None-MatchEtagEtag不同HTTP 304
% If-Match If-MatchEtagEtag相同HTTP 412
% document-id标识的文档_id包含文档标识符_key包含唯一标识给定集合中的文档的键_rev包含修订版
%
% 200
% 304 If-None-Match
% 404
% 412 If-Match412_rev属性中包含找到的文档的当前修订_id和_key
getDocument(PoolNameOrSocket, CollName, Key) ->
getDoc(PoolNameOrSocket, CollName, Key) ->
Path = <<"/_api/document/", CollName/binary, "/", (agMiscUtils:toBinary(Key))/binary>>,
agHttpCli:callAgency(PoolNameOrSocket, ?AgGet, Path, [], undefined).
getDocument(PoolNameOrSocket, CollName, Key, Headers) ->
getDoc(PoolNameOrSocket, CollName, Key, Headers) ->
Path = <<"/_api/document/", CollName/binary, "/", (agMiscUtils:toBinary(Key))/binary>>,
agHttpCli:callAgency(PoolNameOrSocket, ?AgGet, Path, Headers, undefined).
%
% HEAD /_api/document/{collection}/{key}
%
%
%
% collection
% key
%
% If-None-Match If-None-MatchEtagEtagHTTP 200Etag相同HTTP 304
% If-Match If-MatchEtagEtag相同HTTP 412
@ -43,7 +122,6 @@ getDocument(PoolNameOrSocket, CollName, Key, Headers) ->
% 304 If-None-Match
% 404
% 412 If-Match412Etag标头中包含找到的文档的当前版本
getDocHead(PoolNameOrSocket, CollName, Key) ->
Path = <<"/_api/document/", CollName/binary, "/", (agMiscUtils:toBinary(Key))/binary>>,
agHttpCli:callAgency(PoolNameOrSocket, ?AgHead, Path, [], undefined).
@ -55,14 +133,21 @@ getDocHead(PoolNameOrSocket, CollName, Key, Headers) ->
%
% POST /_api/document/{collection}
%
%
% collection
%
% ArangoDB版本<3.0URL路径为/ _api / documentURL路径中指定集合
% collection ArangoDB版本<3.0URL路径为/ _api / documentURL路径中指定集合
% waitForSync
% returnNew new属性下返回完整的新文档
% returnOld old属性下返回完整的旧文档使
% true
% true_key的文档
% silenttrue
% overwritetrue_key的文档
% overwriteMode
% "ignore"_key值的文档使RETURN OLD使 RETURN NEWnull
% "replace"_key值的文档overwrite模式但覆盖 true时使
% "update"_key值的文档使keepNull和 mergeObjects参数进一步控制覆盖模式
% "conflict"_key值的文档使false或未设置
% keepNull使update-insert命令删除现有属性URL查询参数keepNull与 false一起使用patch命令的行为null的现有文档
% mergeObjectsfalsetruetrue
% json
% JSON表示形式
% _key的文档_key_key
@ -81,12 +166,12 @@ getDocHead(PoolNameOrSocket, CollName, Key, Headers) ->
% 400JSON表示形式
% 404collection指定的collection未知
% 409409
newDocument(PoolNameOrSocket, CollName, MapData) ->
newDoc(PoolNameOrSocket, CollName, MapData) ->
Path = <<"/_api/document/", CollName/binary>>,
BodyStr = jiffy:encode(MapData),
agHttpCli:callAgency(PoolNameOrSocket, ?AgPost, Path, [], BodyStr).
newDocument(PoolNameOrSocket, CollName, MapData, QueryPars) ->
newDoc(PoolNameOrSocket, CollName, MapData, QueryPars) ->
QueryBinary = agMiscUtils:spellQueryPars(QueryPars),
Path = <<"/_api/document/", CollName/binary, QueryBinary/binary>>,
BodyStr = jiffy:encode(MapData),
@ -95,16 +180,16 @@ newDocument(PoolNameOrSocket, CollName, MapData, QueryPars) ->
%
% PUT /_api/document/{collection}/{key}
%
%
%
% collection
% key
%
% waitForSync
% ignoreRevstrue_rev属性false_rev属性作为前提
% returnOldold属性下
% returnNew new属性下还返回完整的新文档
% true
% waitForSync
% ignoreRevstrue_rev属性false_rev属性作为前提
% returnOldold属性下
% returnNew new属性下还返回完整的新文档
% silenttrue
%
% If-Match使if-match HTTP标头有条件地根据目标修订版ID替换文档
% If-Match使if-match HTTP标头有条件地根据目标修订版ID替换文档
% json
% JSON表示形式
%
@ -125,12 +210,18 @@ newDocument(PoolNameOrSocket, CollName, MapData, QueryPars) ->
% 400JSON表示形式
% 404
% 412_rev _id和_key
replaceDocument(PoolNameOrSocket, CollName, Key, MapData) ->
replaceDoc(PoolNameOrSocket, CollName, Key, MapData) ->
Path = <<"/_api/document/", CollName/binary, "/", (agMiscUtils:toBinary(Key))/binary>>,
BodyStr = jiffy:encode(MapData),
agHttpCli:callAgency(PoolNameOrSocket, ?AgPut, Path, [], BodyStr).
replaceDocument(PoolNameOrSocket, CollName, Key, MapData, Headers, QueryPars) ->
replaceDoc(PoolNameOrSocket, CollName, Key, MapData, QueryPars) ->
QueryBinary = agMiscUtils:spellQueryPars(QueryPars),
Path = <<"/_api/document/", CollName/binary, "/", (agMiscUtils:toBinary(Key))/binary, QueryBinary/binary>>,
BodyStr = jiffy:encode(MapData),
agHttpCli:callAgency(PoolNameOrSocket, ?AgPut, Path, [], BodyStr).
replaceDoc(PoolNameOrSocket, CollName, Key, MapData, QueryPars, Headers) ->
QueryBinary = agMiscUtils:spellQueryPars(QueryPars),
Path = <<"/_api/document/", CollName/binary, "/", (agMiscUtils:toBinary(Key))/binary, QueryBinary/binary>>,
BodyStr = jiffy:encode(MapData),
@ -139,8 +230,8 @@ replaceDocument(PoolNameOrSocket, CollName, Key, MapData, Headers, QueryPars) ->
%
% PATCH /_api/document/{collection}/{key}
%
%
%
% collection
% key
%
% keepNull使patch命令删除现有属性URL查询参数keepNull与false一起使用patch命令的行为null的现有文档
% mergeObjectsfalsetrue true
@ -148,9 +239,9 @@ replaceDocument(PoolNameOrSocket, CollName, Key, MapData, Headers, QueryPars) ->
% ignoreRevstrue_rev属性false_rev属性作为前提
% returnOldold属性下
% returnNew new属性下还返回完整的新文档
% true
% silenttrue
%
% If-Match使if-match HTTP标头有条件地根据目标修订版ID更新文档
% If-Match使if-match HTTP标头有条件地根据目标修订版ID更新文档
% json
% JSON表示形式作为对象
% document-id标识的文档JSON文档
@ -172,12 +263,18 @@ replaceDocument(PoolNameOrSocket, CollName, Key, MapData, Headers, QueryPars) ->
% 400JSON表示形式
% 404
% 412_rev _id和_key
updateDocument(PoolNameOrSocket, CollName, Key, MapData) ->
updateDoc(PoolNameOrSocket, CollName, Key, MapData) ->
Path = <<"/_api/document/", CollName/binary, "/", (agMiscUtils:toBinary(Key))/binary>>,
BodyStr = jiffy:encode(MapData),
agHttpCli:callAgency(PoolNameOrSocket, ?AgPatch, Path, [], BodyStr).
updateDocument(PoolNameOrSocket, CollName, Key, MapData, Headers, QueryPars) ->
updateDoc(PoolNameOrSocket, CollName, Key, MapData, QueryPars) ->
QueryBinary = agMiscUtils:spellQueryPars(QueryPars),
Path = <<"/_api/document/", CollName/binary, "/", (agMiscUtils:toBinary(Key))/binary, QueryBinary/binary>>,
BodyStr = jiffy:encode(MapData),
agHttpCli:callAgency(PoolNameOrSocket, ?AgPatch, Path, [], BodyStr).
updateDoc(PoolNameOrSocket, CollName, Key, MapData, QueryPars, Headers) ->
QueryBinary = agMiscUtils:spellQueryPars(QueryPars),
Path = <<"/_api/document/", CollName/binary, "/", (agMiscUtils:toBinary(Key))/binary, QueryBinary/binary>>,
BodyStr = jiffy:encode(MapData),
@ -186,12 +283,12 @@ updateDocument(PoolNameOrSocket, CollName, Key, MapData, Headers, QueryPars) ->
%
% DELETE /_api/document/{collection}/{key}
%
%
%
% collection
% key
%
% waitForSync
% returnOldold属性下
% true
% silenttrue
%
% If-Match使if-match HTTP标头有条件地根据目标修订版ID删除文档
% silent未设置为trueJSON对象 _id包含已删除文档的已知文档ID_key _rev包含文档修订版
@ -202,29 +299,32 @@ updateDocument(PoolNameOrSocket, CollName, Key, MapData, Headers, QueryPars) ->
% 202waitForSync为false
% 404
% 412-match_rev属性中包含找到的文档的当前修订_id和_key
delDocument(PoolNameOrSocket, CollName, Key) ->
delDoc(PoolNameOrSocket, CollName, Key) ->
Path = <<"/_api/document/", CollName/binary, "/", (agMiscUtils:toBinary(Key))/binary>>,
agHttpCli:callAgency(PoolNameOrSocket, ?AgDelete, Path, [], undefined).
delDocument(PoolNameOrSocket, CollName, Key, Headers, QueryPars) ->
delDoc(PoolNameOrSocket, CollName, Key, QueryPars) ->
QueryBinary = agMiscUtils:spellQueryPars(QueryPars),
Path = <<"/_api/document/", CollName/binary, "/", (agMiscUtils:toBinary(Key))/binary, QueryBinary/binary>>,
agHttpCli:callAgency(PoolNameOrSocket, ?AgDelete, Path, [], undefined).
delDoc(PoolNameOrSocket, CollName, Key, QueryPars, Headers) ->
QueryBinary = agMiscUtils:spellQueryPars(QueryPars),
Path = <<"/_api/document/", CollName/binary, "/", (agMiscUtils:toBinary(Key))/binary, QueryBinary/binary>>,
agHttpCli:callAgency(PoolNameOrSocket, ?AgDelete, Path, Headers, undefined).
%
%
% ArangoDB支持批量处理文档 使API变体可使客户端分摊整批文档中的单个请求的开销ArangoDB
% ArangoDB将继续处理其余操作X-Arango-Error-Codes标头将包含发生的错误代码及其多重性的映射 1205:10,1210:17101205 171210
% ArangoDB将继续处理其余操作X-Arango-Error-Codes标头将包含发生的错误代码及其多重性的映射 1205:10,1210:17101205 171210
% JSON数组
%
% PUT /_api/document/{collection}#get
%
%
% collection
%
% onlygettrue
% ignoreRevstrue_rev字段的值
% onlygettrue
% ignoreRevstrue_rev字段的值
% _key标识的文档_key值JSON数组
% _key字段的值_rev ignoreRevs设置为false
% ArangoDB可能会回答
@ -233,25 +333,37 @@ delDocument(PoolNameOrSocket, CollName, Key, Headers, QueryPars) ->
% 200
% 400JSON表示形式
% 404
getDocuments(PoolNameOrSocket, CollName, KeyOrMapDataList, QueryPars) ->
QueryBinary = agMiscUtils:spellQueryPars(QueryPars),
% _rev条件不满足 使
getDocs(PoolNameOrSocket, CollName, KeyOrMapDataList) ->
QueryBinary = agMiscUtils:spellQueryPars([{onlyget, true}]),
Path = <<"/_api/document/", CollName/binary, QueryBinary/binary>>,
BodyStr = jiffy:encode(KeyOrMapDataList),
agHttpCli:callAgency(PoolNameOrSocket, ?AgPut, Path, [], BodyStr).
getDocs(PoolNameOrSocket, CollName, KeyOrMapDataList, QueryPars) ->
LastQueryPars =
case lists:keyfind(onlyget, 1, QueryPars) of
{onlyget, true} ->
QueryPars;
_ ->
lists:keystore(onlyget, 1, QueryPars, {onlyget, true})
end,
QueryBinary = agMiscUtils:spellQueryPars(LastQueryPars),
Path = <<"/_api/document/", CollName/binary, QueryBinary/binary>>,
BodyStr = jiffy:encode(KeyOrMapDataList),
agHttpCli:callAgency(PoolNameOrSocket, ?AgPut, Path, [], BodyStr).
%
% POST /_api/document/{collection}#multiple
%
%
% collection
%
% ArangoDB版本<3.0URL路径为/ _api / documentURL路径中指定集合
% waitForSync
% returnNew new属性下返回完整的新文档
% returnOld old属性下返回完整的旧文档使
% true
% true_key的文档
% collectionArangoDB版本<3.0URL路径为/ _api / documentURL路径中指定集合
% waitForSync
% returnNew new属性下返回完整的新文档
% returnOld old属性下返回完整的旧文档使
% silenttrue
% overwritetrue_key的文档
% json
%
% _key的文档_key_key
@ -270,12 +382,13 @@ getDocuments(PoolNameOrSocket, CollName, KeyOrMapDataList, QueryPars) ->
% 202waitForSync为false并且已处理操作
% 400JSON表示形式
% 404collection指定的collection未知
newDocuments(PoolNameOrSocket, CollName, MapDataList) ->
% MapDataList的顺序返回执行结果
newDocs(PoolNameOrSocket, CollName, MapDataList) ->
Path = <<"/_api/document/", CollName/binary>>,
BodyStr = jiffy:encode(MapDataList),
agHttpCli:callAgency(PoolNameOrSocket, ?AgPost, Path, [], BodyStr).
newDocuments(PoolNameOrSocket, CollName, MapDataList, QueryPars) ->
newDocs(PoolNameOrSocket, CollName, MapDataList, QueryPars) ->
QueryBinary = agMiscUtils:spellQueryPars(QueryPars),
Path = <<"/_api/document/", CollName/binary, QueryBinary/binary>>,
BodyStr = jiffy:encode(MapDataList),
@ -284,16 +397,16 @@ newDocuments(PoolNameOrSocket, CollName, MapDataList, QueryPars) ->
%
% PUT /_api/document/{collection}
%
% URL参数是替换文档的集合的名称
% collectionURL参数是替换文档的集合的名称
%
% waitForSync
% ignoreRevstrue_rev属性false_rev属性作为前提
% returnOldold属性下还返回更改后的文档的完整先前修订
% returnNew new属性下还返回完整的新文档
% waitForSync
% ignoreRevstrue_rev属性false_rev属性作为前提
% returnOldold属性下还返回更改后的文档的完整先前修订
% returnNew new属性下还返回完整的新文档
% json
% JSON表示形式
% _key属性指定
% _key属性的值以及用作分片键的属性均不得更改
% _key属性的值以及用作sharding keys的属性均不得更改
% ignoreRevs为false_rev属性
% ArangoDB可能会回答
% 使waitForSync标志waitForSync仍可用于强制将文档替换操作同步到磁盘waitForSync查询参数可用于强制特定操作的同步使waitForSync参数设置为truewaitForSync参数或将其设置为 falsewaitForSync行为waitForSync查询参数不能用于禁用同步用于具有默认集合waitForSync值为true
@ -306,13 +419,12 @@ newDocuments(PoolNameOrSocket, CollName, MapDataList, QueryPars) ->
% 202waitForSync为false并且已处理操作
% 400JSON表示形式
% 404
replaceDocuments(PoolNameOrSocket, CollName, MapDataList) ->
replaceDocs(PoolNameOrSocket, CollName, MapDataList) ->
Path = <<"/_api/document/", CollName/binary>>,
BodyStr = jiffy:encode(MapDataList),
agHttpCli:callAgency(PoolNameOrSocket, ?AgPut, Path, [], BodyStr).
replaceDocuments(PoolNameOrSocket, CollName, MapDataList, QueryPars) ->
replaceDocs(PoolNameOrSocket, CollName, MapDataList, QueryPars) ->
QueryBinary = agMiscUtils:spellQueryPars(QueryPars),
Path = <<"/_api/document/", CollName/binary, QueryBinary/binary>>,
BodyStr = jiffy:encode(MapDataList),
@ -321,7 +433,7 @@ replaceDocuments(PoolNameOrSocket, CollName, MapDataList, QueryPars) ->
%
% PATCH /_api/document/{collection}
%
%
% collection
%
% keepNull使patch命令删除现有属性URL查询参数keepNull与false一起使用patch命令的行为null的现有文档
% mergeObjectsfalsetrue true
@ -346,27 +458,25 @@ replaceDocuments(PoolNameOrSocket, CollName, MapDataList, QueryPars) ->
% 202waitForSync为false并且已处理操作
% 400JSON表示形式
% 404
updateDocuments(PoolNameOrSocket, CollName, MapDataList) ->
updateDocs(PoolNameOrSocket, CollName, MapDataList) ->
Path = <<"/_api/document/", CollName/binary>>,
BodyStr = jiffy:encode(MapDataList),
agHttpCli:callAgency(PoolNameOrSocket, ?AgPatch, Path, [], BodyStr).
updateDocuments(PoolNameOrSocket, CollName, MapDataList, QueryPars) ->
updateDocs(PoolNameOrSocket, CollName, MapDataList, QueryPars) ->
QueryBinary = agMiscUtils:spellQueryPars(QueryPars),
Path = <<"/_api/document/", CollName/binary, QueryBinary/binary>>,
BodyStr = jiffy:encode(MapDataList),
agHttpCli:callAgency(PoolNameOrSocket, ?AgPatch, Path, [], BodyStr).
%
% DELETE /_api/document/{collection}
%
%
% collection
%
% waitForSync
% returnOldold属性下
% ignoreRevstrue_rev属性
% waitForSync
% returnOldold属性下
% ignoreRevstrue_rev属性
% json
% JSON数组
% _key属性的对象API调用从collection中删除所有指定的文档_rev属性
@ -378,13 +488,12 @@ updateDocuments(PoolNameOrSocket, CollName, MapDataList, QueryPars) ->
% 200waitForSync为true
% 202waitForSync为false
% 404
delDocuments(PoolNameOrSocket, CollName, KeyOrMapDataList) ->
delDocs(PoolNameOrSocket, CollName, KeyOrMapDataList) ->
Path = <<"/_api/document/", CollName/binary, "/">>,
BodyStr = jiffy:encode(KeyOrMapDataList),
agHttpCli:callAgency(PoolNameOrSocket, ?AgDelete, Path, [], BodyStr).
delDocuments(PoolNameOrSocket, CollName, KeyOrMapDataList, QueryPars) ->
delDocs(PoolNameOrSocket, CollName, KeyOrMapDataList, QueryPars) ->
QueryBinary = agMiscUtils:spellQueryPars(QueryPars),
Path = <<"/_api/document/", CollName/binary, QueryBinary/binary>>,
BodyStr = jiffy:encode(KeyOrMapDataList),

Loading…
Откажи
Сачувај