diff --git a/src/agApi/agAsyncResultHandling.erl b/src/agApi/agAsyncResultHandling.erl index 4d8d0cc..8a28c77 100644 --- a/src/agApi/agAsyncResultHandling.erl +++ b/src/agApi/agAsyncResultHandling.erl @@ -67,8 +67,8 @@ % 400:如果在请求中未指定作业ID,则返回。在这种情况下,不会返回x-arango-async-id HTTP标头。 % 404:如果找不到或已经从作业结果列表中删除或提取了作业,则返回404。在这种情况下,不会返回x-arango-async-id HTTP标头。 getAsyncJobRet(PoolNameOrSocket, JodId) -> - Path = <<"/_api/job/", (agMiscUtils:toBinary(JodId))/binary>>, - agVstCli:callAgency(PoolNameOrSocket, ?AgPut, Path). + Path = <<"/_api/job/", (agMiscUtils:toBinary(JodId))/binary>>, + agVstCli:callAgency(PoolNameOrSocket, ?AgPut, Path). % 取消异步作业 @@ -81,8 +81,8 @@ getAsyncJobRet(PoolNameOrSocket, JodId) -> % 400:如果在请求中未指定作业ID,则返回。在这种情况下,不会返回x-arango-async-id HTTP标头。 % 404:如果找不到或已经从作业结果列表中删除或提取了作业,则返回404。在这种情况下,不会返回x-arango-async-id HTTP标头。 cancelAsyncJob(PoolNameOrSocket, JodId) -> - Path = <<"/_api/job/", (agMiscUtils:toBinary(JodId))/binary, "/cancel">>, - agVstCli:callAgency(PoolNameOrSocket, ?AgPut, Path). + Path = <<"/_api/job/", (agMiscUtils:toBinary(JodId))/binary, "/cancel">>, + agVstCli:callAgency(PoolNameOrSocket, ?AgPut, Path). % 删除异步作业结果 % DELETE /_api/job/{type}#by-type @@ -99,12 +99,12 @@ cancelAsyncJob(PoolNameOrSocket, JodId) -> % 400:如果未指定type或值无效,则返回。 % 404:如果type为job-id,但未找到具有指定id的异步作业,则返回404。 delAsyncJobRet(PoolNameOrSocket, TypeOrJodId) -> - Path = <<"/_api/job/", (agMiscUtils:toBinary(TypeOrJodId))/binary>>, - agVstCli:callAgency(PoolNameOrSocket, ?AgDelete, Path). + Path = <<"/_api/job/", (agMiscUtils:toBinary(TypeOrJodId))/binary>>, + agVstCli:callAgency(PoolNameOrSocket, ?AgDelete, Path). delAsyncJobRet(PoolNameOrSocket, TypeOrJodId, QueryPars) -> - Path = <<"/_api/job/", (agMiscUtils:toBinary(TypeOrJodId))/binary>>, - agVstCli:callAgency(PoolNameOrSocket, ?AgDelete, Path, QueryPars). + Path = <<"/_api/job/", (agMiscUtils:toBinary(TypeOrJodId))/binary>>, + agVstCli:callAgency(PoolNameOrSocket, ?AgDelete, Path, QueryPars). % 返回特定作业的状态 % GET /_api/job/{job-id} @@ -116,8 +116,8 @@ delAsyncJobRet(PoolNameOrSocket, TypeOrJodId, QueryPars) -> % 204:如果通过job-id请求的作业仍在待处理(或尚未完成)的作业队列中,则返回。 % 404:如果找不到或已经从作业结果列表中删除或提取了作业,则返回404。 getAsyncJobStatus(PoolNameOrSocket, JodId) -> - Path = <<"/_api/job/", (agMiscUtils:toBinary(JodId))/binary>>, - agVstCli:callAgency(PoolNameOrSocket, ?AgGet, Path). + Path = <<"/_api/job/", (agMiscUtils:toBinary(JodId))/binary>>, + agVstCli:callAgency(PoolNameOrSocket, ?AgGet, Path). % 返回具有特定状态的工作结果ID % GET /_api/job/{type}#by-type @@ -130,10 +130,9 @@ getAsyncJobStatus(PoolNameOrSocket, JodId) -> % 200:如果列表可以成功编译,则返回。注意:该列表可能为空。 % 400:如果未指定type或值无效,则返回。 getAsyncJobList(PoolNameOrSocket, Type) -> - Path = <<"/_api/job/", (agMiscUtils:toBinary(Type))/binary>>, - agVstCli:callAgency(PoolNameOrSocket, ?AgGet, Path). - -getAsyncJobList(PoolNameOrSocket, Type, Count) -> - Path = <<"/_api/job/", (agMiscUtils:toBinary(Type))/binary, "?count=", (agMiscUtils:toBinary(Count))/binary>>, - agVstCli:callAgency(PoolNameOrSocket, ?AgGet, Path). + Path = <<"/_api/job/", (agMiscUtils:toBinary(Type))/binary>>, + agVstCli:callAgency(PoolNameOrSocket, ?AgGet, Path). +getAsyncJobList(PoolNameOrSocket, Type, QueryPars) -> + Path = <<"/_api/job/", (agMiscUtils:toBinary(Type))/binary>>, + agVstCli:callAgency(PoolNameOrSocket, ?AgGet, Path, QueryPars). \ No newline at end of file diff --git a/src/agApi/agBulkImportExport.erl b/src/agApi/agBulkImportExport.erl deleted file mode 100644 index ef0b0ee..0000000 --- a/src/agApi/agBulkImportExport.erl +++ /dev/null @@ -1,231 +0,0 @@ --module(agBulkImportExport). --include("eArango.hrl"). - --compile(inline). --compile({inline_size, 128}). --compile([export_all, nowarn_export_all]). - -%% IMY-todo 这个文档需要修改 需要引入json - -% doc_address:https://www.arangodb.com/docs/stable/http/bulk-imports.html - -% 批量导入的HTTP接口 -% ArangoDB提供了一个HTTP接口,可以一次将多个文档导入一个集合中。这称为批量导入。 -% 上传的数据必须以JSON格式提供。有两种导入数据的机制: -% 自包含的JSON文档:在这种情况下,每个文档都包含所有属性名称和值。在上传的文档中,属性名称可能完全不同 -% 属性名称加上文档数据:在这种情况下,第一个数组必须包含后面文档的属性名称。以下数组仅包含属性值。属性值将按位置映射到属性名称。 -% 两种输入机制的端点地址均为/ _api / import。必须使用HTTP POST请求将数据发送到此URL。要导入的数据必须包含在POST请求的正文中。 -% 该集合的查询参数必须用于指定目标集合导入。将数据导入到不存在的集合中将产生错误。 -% 可以将waitForSync查询参数设置为true,以仅在所有文档都已同步到磁盘后才返回导入。 -% 如果任何上传的文档无效并且无法导入,可以将complete查询参数设置为true,以使整个导入失败。在这种情况下,即使在导入结束时发生故障,导入操作也不会导入任何文档。 -% 如果complete具有除true以外的其他值,则将导入有效文档,而拒绝无效文档,这意味着可能仅导入了一些上载文档。 -% 可以将details查询参数设置为true,以使导入API返回有关无法导入的文档的详细信息。如果details为true,则结果还将包含一个details属性,该属性是详细错误消息的数组。如果将详细信息设置为false或省略,则不会返回任何详细信息。 - -% 从JSON编码的列表中导入文档 -% POST /_api/import#document -% 查询参数 -% collection (必填):集合名称。 -% fromPrefix(可选):_from属性中值的可选前缀。如果指定,该值将自动添加到每个_from输入值之前。这样就可以仅指定的键_from。 -% toPrefix(可选):_to属性中值的可选前缀。如果指定,该值将自动添加到每个_to输入值之前。这样就可以仅指定的键_to。 -% overwrite (可选):如果此参数的值为true或yes,则将在导入之前删除集合中的所有数据。请注意,任何现有的索引定义都将保留。 -% waitForSync(可选):等待文档同步到磁盘后再返回。 -% onDuplicate(可选):控制在违反唯一键约束的情况下执行的操作。可能的值为: -% error:由于违反唯一键约束,因此不会导入当前文档。这是默认设置。 -% update:这将使用请求中指定的数据更新数据库中的现有文档。请求中不存在的现有文档的属性将被保留。 -% replace:这将用请求中指定的数据替换数据库中的现有文档。 -% ignore:这不会更新现有文档,而只是忽略由唯一键约束冲突引起的错误。 -% 请注意,仅当请求中的导入文档包含_key属性时,update,replace和ignore才起作用。由于次要唯一键约束冲突,更新和 替换也可能失败。 -% -% complete (可选):如果设置为true或yes,则如果发生任何错误,将使整个导入失败。否则,即使无法导入某些文档,导入也将继续。 -% details(可选):如果设置为true或yes,结果将包括一个属性,details 其中包含有关无法导入的文档的详细信息。 -% -% 请求正文(字符串) -% 主体必须由JSON编码的属性值数组组成,每个文档一行。请求的第一行必须是JSON编码的属性名称数组。这些属性名称用于后续各行中的数据。 -% 在由标识的集合中创建文档collection-name。请求正文的第一行必须包含一个JSON编码的属性名称数组。请求正文中的以下所有行都必须包含JSON编码的属性值数组。每行都被解释为一个单独的文档,并且指定的值将映射到在第一标题行中指定的属性名称的数组。 -% -% 响应是具有以下属性的JSON对象: -% created:导入的文件数。 -% errors:由于错误而未导入的文档数。 -% empty:在输入中找到的空行数(类型documents或只能包含大于零的值auto)。 -% updated:更新/替换的文档数(如果onDuplicate 设置为update或replace)。 -% ignored:失败但被忽略的插入操作数(如果 onDuplicate设置为ignore)。 -% details:如果查询参数details设置为true,则结果将包含一个details属性,该属性是一个数组,其中包含有关无法插入哪些文档的更多详细信息。 -% -% 返回码 -% 201:如果可以成功导入所有文档,则返回。 -% 400:如果type包含无效值,未collection指定no ,文档编码错误或请求格式错误,则返回。 -% 404:如果collection或导入边的_from或_to属性引用未知集合,则返回。 -% 409:如果导入会触发唯一键冲突,complete则返回,并将 其设置为true。 -% 500:如果服务器无法为没有用户定义密钥的文档自动生成文档密钥(密钥错误),则返回500。 -docImport(PoolNameOrSocket, ListOfList, QueryPars) -> - BodyStr = <<<<(jiffy:encode(OneList))/binary, "\n">> || OneList <- ListOfList>>, - agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/import">>, QueryPars, ?AgDefHeader, BodyStr). - -% 从JSON导入文档 -% POST /_api/import#json -% 查询参数 -% type (必填):确定如何解释请求的正文。type可以具有以下值: -% documents:使用此类型时,请求正文中的每一行都应为单独的JSON编码的文档。请求主体中的多个JSON对象需要用换行符分隔。 -% list:使用此类型时,请求主体必须包含要导入的单个对象的单个JSON编码数组。 -% auto:如果设置,它将自动确定主体类型( documents或list)。 -% collection (必填):集合名称。 -% fromPrefix(可选):_from属性中值的可选前缀。如果指定,该值将自动添加到每个_from输入值之前。这样就可以仅指定的键_from。 -% toPrefix(可选):_to属性中值的可选前缀。如果指定,该值将自动添加到每个_to输入值之前。这样就可以仅指定的键_to。 -% overwrite (可选):如果此参数的值为true或yes,则将在导入之前删除集合中的所有数据。请注意,任何现有的索引定义都将保留。 -% waitForSync(可选):等待文档同步到磁盘后再返回。 -% onDuplicate(可选):控制在违反唯一键约束的情况下执行的操作。可能的值为: -% error:由于违反唯一键约束,因此不会导入当前文档。这是默认设置。 -% update:这将使用请求中指定的数据更新数据库中的现有文档。请求中不存在的现有文档的属性将被保留。 -% replace:这将用请求中指定的数据替换数据库中的现有文档。 -% ignore:这不会更新现有文档,而只是忽略由唯一键约束冲突引起的错误。 -% 请注意,仅当请求中的导入文档包含_key属性时,update,replace和ignore才起作用。由于次要唯一键约束冲突,更新和 替换也可能失败。 -% complete (可选):如果设置为true或yes,则如果发生任何错误,将使整个导入失败。否则,即使无法导入某些文档,导入也将继续。 -% details(可选):如果设置为true或yes,结果将包括一个属性,details 其中包含有关无法导入的文档的详细信息。 -% 请求正文(字符串) -% 主体必须是JSON编码的对象数组,或者是包含多个以换行符分隔的JSON对象的字符串。 -% 在由标识的集合中创建文档collection-name。文档的JSON表示形式必须作为POST请求的主体传递。请求主体可以由多行组成,每行都是一个独立的JSON对象,也可以是包含子对象的JSON数组。 -% -% 响应是具有以下属性的JSON对象: -% created:导入的文件数。 -% errors:由于错误而未导入的文档数。 -% empty:在输入中找到的空行数(类型documents或只能包含大于零的值auto)。 -% updated:更新/替换的文档数(如果onDuplicate 设置为update或replace)。 -% ignored:失败但被忽略的插入操作数(如果 onDuplicate设置为ignore)。 -% details:如果查询参数details设置为true,则结果将包含一个details属性,该属性是一个数组,其中包含有关无法插入哪些文档的更多详细信息。 -% 返回码 -% 201:如果可以成功导入所有文档,则返回。 -% 400:如果type包含无效值,未collection指定no ,文档编码错误或请求格式错误,则返回。 -% 404:如果collection或导入边的_from或_to属性引用未知集合,则返回。 -% 409:如果导入会触发唯一键冲突,complete则返回,并将 其设置为true。 -% 500:如果服务器无法为没有用户定义密钥的文档自动生成文档密钥(密钥错误),则返回500。 -jsonImport(PoolNameOrSocket, MapDataList, QueryPars) -> - case QueryPars of - #{type := list} -> - BodyStr = jiffy:encode(MapDataList); - #{type := documents} -> - BodyStr = <<<<(jiffy:encode(OneList))/binary, "\n">> || OneList <- MapDataList>>; - _ -> - BodyStr = MapDataList - end, - agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/import">>, QueryPars, ?AgDefHeader, BodyStr). - -% 说明-------> -% 导入自包含的JSON文档 -% 此导入方法允许上传自包含的JSON文档。这些文档必须上传到HTTP POST请求的正文中。正文的每一行都将被解释为一个独立文档。正文中的空行是允许的,但将被跳过。使用此格式,文档将逐行导入。 -% -% 输入数据示例:{“ _key”:“ key1”,……} {“ _key”:“ key2”,……}… -% -% 要使用此方法,应将类型查询参数设置为documents。 -% -% 还可以上传嵌入到JSON数组中的自包含JSON文档。数组中的每个元素都将被视为文档并导入。 -% -% 这种情况下的示例输入数据: -% -% [ -% { "_key": "key1", ... }, -% { "_key": "key2", ... }, -% ... -% ] -% 此格式不需要每个文档都位于单独的行上,并且JSON数据中允许使用任何空格。它可以用于将JSON格式的结果数组(例如,从arangosh中)导入回ArangoDB中。使用此格式需要ArangoDB解析整个数组,并在导入期间将其保留在内存中。这可能比逐行处理要消耗更多的资源。 -% -% 要使用此方法,类型查询参数应设置为array。 -% -% 将类型查询参数设置为auto将使服务器自动检测数据是按行的JSON文档(类型=文档)还是JSON数组(类型=数组)。 -% -% 例子 -% -% curl --data-binary @- -X POST --dump - "http://localhost:8529/_api/import?type=documents&collection=test" -% { "name" : "test", "gender" : "male", "age" : 39 } -% { "type" : "bird", "name" : "robin" } -% -% HTTP/1.1 201 Created -% Server: ArangoDB -% Connection: Keep-Alive -% Content-type: application/json; charset=utf-8 -% -% {"error":false,"created":2,"empty":0,"errors":0} -% 如果一切顺利,服务器将以HTTP 201响应。导入的文档数将在响应的创建的属性中返回。如果任何文档被跳过或格式错误,将在errors属性中返回该文档。响应中还将有一个空属性,其中包含值为0。 -% -% 如果在请求中将details参数设置为true,则响应还将包含一个属性details,该属性是有关导入期间在服务器端发生的错误的详细信息的数组。如果没有发生错误,则此数组可能为空。 - -% 导入标题和值 -% 使用这种类型的导入时,要与实际文档值数据分开指定要导入的文档的属性名称。HTTP POST请求正文的第一行必须是JSON数组,其中包含后面文档的属性名称。以下各行被解释为文档数据。每个文档必须是值的JSON数组。此数据部分中不需要或不允许属性名称。 -% 例子 -% curl --data-binary @- -X POST --dump - "http://localhost:8529/_api/import?collection=test" -% [ "firstName", "lastName", "age", "gender" ] -% [ "Joe", "Public", 42, "male" ] -% [ "Jane", "Doe", 31, "female" ] -% -% HTTP/1.1 201 Created -% Server: ArangoDB -% Connection: Keep-Alive -% Content-type: application/json; charset=utf-8 -% -% {"error":false,"created":2,"empty":0,"errors":0} -% 如果一切顺利,服务器将再次以HTTP 201响应。导入的文档数将在响应的创建的属性中返回。如果任何文档被跳过或格式错误,将在errors属性中返回该文档。输入文件中的空行数将在empty属性中返回。 -% -% 如果在请求中将details参数设置为true,则响应还将包含一个属性details,该属性是有关导入期间在服务器端发生的错误的详细信息的数组。如果没有发生错误,则此数组可能为空。 -% -% 导入到边缘集合 -% 请注意,将文档导入 边缘集合时,必须强制所有导入的文档都包含_from和_to属性,并且这些属性必须包含对现有集合的引用。 - -% 批处理请求的HTTP接口 -% 客户端通常在单独的HTTP请求中向ArangoDB发送单独的操作。这是直接且简单的,但是具有以下缺点:如果连续发出许多小请求,则网络开销可能会很大。 -% 为了缓解此问题,ArangoDB提供了一个批处理请求API,客户端可以使用该API批量向ArangoDB发送多个操作。当客户端必须以较小的正文/有效负载发送许多HTTP请求并且各个请求的结果彼此不依赖时,此方法特别有用。 -% 客户端可以通过向URL / _api / batch处理程序发出多部分HTTP POST请求来使用ArangoDB的批处理API 。如果Content-type为multipart / form-data,则处理程序将接受请求并指定边界字符串。然后,ArangoDB将使用此边界将批处理请求分解为各个部分。这也意味着边界字符串本身不能包含在任何部分中。当ArangoDB将多部分请求分为其各个部分时,它将按顺序处理所有部分,就好像它是一个独立的请求一样。处理完所有零件后,ArangoDB将生成一个多部分HTTP响应,其中每个零件操作结果都包含一个零件。例如,如果您发送包含5个部分的多部分请求,则ArangoDB还将发送包含5个部分的多部分响应。 -% 服务器希望每个零件消息均以以下“头”开头: -% Content-type: application/x-arango-batchpart -% 您可以选择指定Content-Id “标头”以唯一标识每个零件消息。如果已指定,服务器将在其响应中返回Content-Id。否则,服务器将不会发回Content-Id“标头”。服务器将不会验证Content-Id的唯一性。在强制性Content-type和可选Content-Id标头之后,必须紧跟两个Windows换行符(即\ r \ n \ r \ n)。该结构的任何偏差都可能导致零件被拒绝或错误解释。零件请求有效载荷(格式为常规HTTP请求)必须直接遵循两个Windows换行符。 -% 请注意,从 技术上来说,文字Content-type:application / x-arango-batchpart是MIME部分的标头,而HTTP请求(包括其标头)是MIME部分的正文部分。 -% 实际的零件请求应以通常的HTTP方法,被调用的URL和HTTP协议版本开头,后跟任意的HTTP标头。它的主体应遵循通常的\ r \ n \ r \ n 文字。因此,部分请求是常规的HTTP请求,仅嵌入在多部分消息中。 -% 以下示例将发送具有3个单独文档创建操作的批处理。在此示例中使用的边界是 XXXsubpartXXX。 -% ******************************************************************* -% 批处理请求的HTTP接口 改功能不予实现支持 -% ******************************************************************* - -% 使用光标导出集合中的所有文档 -% POST /_api/export -% 查询参数 -% collection (必填):要导出的集合的名称。 -% 具有以下属性的JSON对象是必需的: -% flush:如果设置为true,则将在导出之前执行WAL刷新操作。刷新操作将开始将文档从WAL复制到集合的数据文件中。刷新后还会有最长为flushWait秒的额外等待时间,以使WAL收集器也可以更改调整后的文档元数据以指向数据文件。默认值为false(即不刷新),因此导出中可能缺少集合中最新插入或更新的文档。 -% flushWait:刷新操作后的最大等待时间(以秒为单位)。默认值为10。仅当flush设置为true时,此选项才有效。 -% count:布尔值标志,指示是否应在结果的“ count”属性中返回结果集中的文档数(可选)。计算“ count”属性将来可能会对性能产生影响,因此默认情况下将关闭此选项,并且仅在请求时才返回“ count”。 -% batchSize:一次往返(从服务器到客户端)要传输的最大结果文档数(可选)。如果未设置此属性,则将使用服务器控制的默认值。 -% limit:可选的限制值,确定要包含在光标中的最大文档数。省略limit属性或将其设置为0将导致不使用任何限制。如果使用限制,则不确定集合中的哪些文档将包含在导出中,哪些文档将排除在外。这是因为集合中没有自然的文档顺序。 -% ttl:光标的可选生存时间(以秒为单位)。在指定的时间后,游标将自动在服务器上删除。这对于确保客户端不完全获取的游标的垃圾回收很有用。如果未设置,将使用服务器定义的值。 -% restrict:包含以下属性的对象,返回结果文档时将包含或排除这些属性名称。默认情况下,不指定 限制将返回每个文档的所有属性。 -% type:必须根据要使用的类型设置为 include or exclude -% fields:包含要包含或排除的属性名称的数组。包含或排除属性名称的匹配将仅在顶层完成。目前不支持指定嵌套属性的名称。 -% 对此方法的调用将创建一个游标,其中包含指定集合中的所有文档。与其他数据生成API相比,导出API生成的内部数据结构更轻便,因此这是从集合中检索所有文档的首选方法。 -% 以与/_api/cursorREST API中相似的方式返回文档。如果集合的所有文档都适合第一批,则不会创建任何游标,并且结果对象的hasMore属性将设置为 false。如果不是所有文档都适合第一批文档,则结果对象的hasMore属性将设置为true,并且结果的id属性将包含游标id。 -% 未指定文件退回的顺序。 -% -% 默认情况下,将仅返回集合中存储在集合数据文件中的那些文档。运行导出时在预写日志(WAL)中存在的文档将不会导出。 -% 为了也导出这些文档,调用者可以在调用导出API或设置flush属性之前发出WAL刷新请求。设置冲洗 选项将在导出之前触发WAL冲洗,以便将文档从WAL复制到集合数据文件。 -% 如果服务器可以创建结果集,则服务器将使用HTTP 201进行响应 。响应的主体将包含带有结果集的JSON对象。 -% 返回的JSON对象具有以下属性: -% error:布尔值标志,指示发生错误( 在这种情况下为false) -% code:HTTP状态码 -% result:结果文档数组(如果集合为空,则可能为空) -% hasMore:一个布尔指示器,指示服务器上的光标是否还有更多结果可用 -% count:可用结果文档总数(仅当查询是在设置了count属性的情况下执行的) -% id:在服务器上创建的临时光标的ID(可选,请参见上文) -% 如果JSON格式不正确或请求中缺少查询规范,则服务器将使用HTTP 400进行响应。 -% 响应的主体将包含带有其他错误详细信息的JSON对象。该对象具有以下属性: -% error:布尔值标志,指示发生错误(在这种情况下为true) -% code:HTTP状态码 -% errorNum:服务器错误号 -% errorMessage:描述性错误消息 -% 客户端应该始终尽早删除导出游标结果,因为缠结的导出游标会阻止基础集合被压缩或卸载。默认情况下,未使用的游标将在服务器定义的空闲时间后自动删除,并且客户端可以通过设置ttl值来调整此空闲时间。 -% 注意:群集协调器当前不支持此API。 -% 返回码 -% 201:如果服务器可以创建结果集,则返回。 -% 400:如果JSON表示格式错误或请求中缺少查询规范,则返回。 -% 404:如果查询中访问了不存在的集合,服务器将以HTTP 404进行响应。 -% 405:如果使用了不受支持的HTTP方法,则服务器将以HTTP 405进行响应。 -% 501:如果在群集协调器上调用此API,则服务器将使用HTTP 501进行响应。 -docExport(PoolNameOrSocket, CollName, MapData) -> - Path = <<"/_api/export?collection=", CollName/binary>>, - BodyStr = eVPack:encodeBin(MapData), - agVstCli:callAgency(PoolNameOrSocket, ?AgPost, Path, ?AgDefQuery, ?AgDefHeader, BodyStr). \ No newline at end of file diff --git a/src/agApi/agBulkImports.erl b/src/agApi/agBulkImports.erl new file mode 100644 index 0000000..b46b25a --- /dev/null +++ b/src/agApi/agBulkImports.erl @@ -0,0 +1,110 @@ +-module(agBulkImports). +-include("eArango.hrl"). + +-compile(inline). +-compile({inline_size, 128}). +-compile([export_all, nowarn_export_all]). + +%% IMY-todo 这个模块不可用 + +% doc_address:https://www.arangodb.com/docs/stable/http/bulk-imports.html + +% 批量导入的HTTP接口 +% ArangoDB提供了一个HTTP接口,可以一次将多个文档导入一个集合中。这称为批量导入。 +% 上传的数据必须以JSON格式提供。有两种导入数据的机制: +% 自包含的JSON文档:在这种情况下,每个文档都包含所有属性名称和值。在上传的文档中,属性名称可能完全不同 +% 属性名称加上文档数据:在这种情况下,第一个数组必须包含后面文档的属性名称。以下数组仅包含属性值。属性值将按位置映射到属性名称。 +% 两种输入机制的端点地址均为/ _api / import。必须使用HTTP POST请求将数据发送到此URL。要导入的数据必须包含在POST请求的正文中。 +% 该集合的查询参数必须用于指定目标集合导入。将数据导入到不存在的集合中将产生错误。 +% 可以将waitForSync查询参数设置为true,以仅在所有文档都已同步到磁盘后才返回导入。 +% 如果任何上传的文档无效并且无法导入,可以将complete查询参数设置为true,以使整个导入失败。在这种情况下,即使在导入结束时发生故障,导入操作也不会导入任何文档。 +% 如果complete具有除true以外的其他值,则将导入有效文档,而拒绝无效文档,这意味着可能仅导入了一些上载文档。 +% 可以将details查询参数设置为true,以使导入API返回有关无法导入的文档的详细信息。如果details为true,则结果还将包含一个details属性,该属性是详细错误消息的数组。如果将详细信息设置为false或省略,则不会返回任何详细信息。 + +% 从JSON编码的列表中导入文档 +% POST /_api/import#document +% 查询参数 +% collection (必填):集合名称。 +% fromPrefix(可选):_from属性中值的可选前缀。如果指定,该值将自动添加到每个_from输入值之前。这样就可以仅指定的键_from。 +% toPrefix(可选):_to属性中值的可选前缀。如果指定,该值将自动添加到每个_to输入值之前。这样就可以仅指定的键_to。 +% overwrite (可选):如果此参数的值为true或yes,则将在导入之前删除集合中的所有数据。请注意,任何现有的索引定义都将保留。 +% waitForSync(可选):等待文档同步到磁盘后再返回。 +% onDuplicate(可选):控制在违反唯一键约束的情况下执行的操作。可能的值为: +% error:由于违反唯一键约束,因此不会导入当前文档。这是默认设置。 +% update:这将使用请求中指定的数据更新数据库中的现有文档。请求中不存在的现有文档的属性将被保留。 +% replace:这将用请求中指定的数据替换数据库中的现有文档。 +% ignore:这不会更新现有文档,而只是忽略由唯一键约束冲突引起的错误。 +% 请注意,仅当请求中的导入文档包含_key属性时,update,replace和ignore才起作用。由于次要唯一键约束冲突,更新和 替换也可能失败。 +% +% complete (可选):如果设置为true或yes,则如果发生任何错误,将使整个导入失败。否则,即使无法导入某些文档,导入也将继续。 +% details(可选):如果设置为true或yes,结果将包括一个属性,details 其中包含有关无法导入的文档的详细信息。 +% +% 请求正文(字符串) +% 主体必须由JSON编码的属性值数组组成,每个文档一行。请求的第一行必须是JSON编码的属性名称数组。这些属性名称用于后续各行中的数据。 +% 在由标识的集合中创建文档collection-name。请求正文的第一行必须包含一个JSON编码的属性名称数组。请求正文中的以下所有行都必须包含JSON编码的属性值数组。每行都被解释为一个单独的文档,并且指定的值将映射到在第一标题行中指定的属性名称的数组。 +% +% 响应是具有以下属性的JSON对象: +% created:导入的文件数。 +% errors:由于错误而未导入的文档数。 +% empty:在输入中找到的空行数(类型documents或只能包含大于零的值auto)。 +% updated:更新/替换的文档数(如果onDuplicate 设置为update或replace)。 +% ignored:失败但被忽略的插入操作数(如果 onDuplicate设置为ignore)。 +% details:如果查询参数details设置为true,则结果将包含一个details属性,该属性是一个数组,其中包含有关无法插入哪些文档的更多详细信息。 +% +% 返回码 +% 201:如果可以成功导入所有文档,则返回。 +% 400:如果type包含无效值,未collection指定no ,文档编码错误或请求格式错误,则返回。 +% 404:如果collection或导入边的_from或_to属性引用未知集合,则返回。 +% 409:如果导入会触发唯一键冲突,complete则返回,并将 其设置为true。 +% 500:如果服务器无法为没有用户定义密钥的文档自动生成文档密钥(密钥错误),则返回500。 +docImports(PoolNameOrSocket, ListOfList, QueryPars) -> + BodyStr = <<<<(eVPack:encodeBin(OneList))/binary, "\n">> || OneList <- ListOfList>>, + agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/import">>, QueryPars, ?AgDefHeader, BodyStr). + +% 从JSON导入文档 +% POST /_api/import#json +% 查询参数 +% type (必填):确定如何解释请求的正文。type可以具有以下值: +% documents:使用此类型时,请求正文中的每一行都应为单独的JSON编码的文档。请求主体中的多个JSON对象需要用换行符分隔。 +% list:使用此类型时,请求主体必须包含要导入的单个对象的单个JSON编码数组。 +% auto:如果设置,它将自动确定主体类型( documents或list)。 +% collection (必填):集合名称。 +% fromPrefix(可选):_from属性中值的可选前缀。如果指定,该值将自动添加到每个_from输入值之前。这样就可以仅指定的键_from。 +% toPrefix(可选):_to属性中值的可选前缀。如果指定,该值将自动添加到每个_to输入值之前。这样就可以仅指定的键_to。 +% overwrite (可选):如果此参数的值为true或yes,则将在导入之前删除集合中的所有数据。请注意,任何现有的索引定义都将保留。 +% waitForSync(可选):等待文档同步到磁盘后再返回。 +% onDuplicate(可选):控制在违反唯一键约束的情况下执行的操作。可能的值为: +% error:由于违反唯一键约束,因此不会导入当前文档。这是默认设置。 +% update:这将使用请求中指定的数据更新数据库中的现有文档。请求中不存在的现有文档的属性将被保留。 +% replace:这将用请求中指定的数据替换数据库中的现有文档。 +% ignore:这不会更新现有文档,而只是忽略由唯一键约束冲突引起的错误。 +% 请注意,仅当请求中的导入文档包含_key属性时,update,replace和ignore才起作用。由于次要唯一键约束冲突,更新和 替换也可能失败。 +% complete (可选):如果设置为true或yes,则如果发生任何错误,将使整个导入失败。否则,即使无法导入某些文档,导入也将继续。 +% details(可选):如果设置为true或yes,结果将包括一个属性,details 其中包含有关无法导入的文档的详细信息。 +% 请求正文(字符串) +% 主体必须是JSON编码的对象数组,或者是包含多个以换行符分隔的JSON对象的字符串。 +% 在由标识的集合中创建文档collection-name。文档的JSON表示形式必须作为POST请求的主体传递。请求主体可以由多行组成,每行都是一个独立的JSON对象,也可以是包含子对象的JSON数组。 +% +% 响应是具有以下属性的JSON对象: +% created:导入的文件数。 +% errors:由于错误而未导入的文档数。 +% empty:在输入中找到的空行数(类型documents或只能包含大于零的值auto)。 +% updated:更新/替换的文档数(如果onDuplicate 设置为update或replace)。 +% ignored:失败但被忽略的插入操作数(如果 onDuplicate设置为ignore)。 +% details:如果查询参数details设置为true,则结果将包含一个details属性,该属性是一个数组,其中包含有关无法插入哪些文档的更多详细信息。 +% 返回码 +% 201:如果可以成功导入所有文档,则返回。 +% 400:如果type包含无效值,未collection指定no ,文档编码错误或请求格式错误,则返回。 +% 404:如果collection或导入边的_from或_to属性引用未知集合,则返回。 +% 409:如果导入会触发唯一键冲突,complete则返回,并将 其设置为true。 +% 500:如果服务器无法为没有用户定义密钥的文档自动生成文档密钥(密钥错误),则返回500。 +jsonImports(PoolNameOrSocket, MapDataList, QueryPars) -> + case QueryPars of + #{type := list} -> + BodyStr = eVPack:encodeBin(MapDataList); + #{type := documents} -> + BodyStr = <<<<(eVPack:encodeBin(OneList))/binary, "\n">> || OneList <- MapDataList>>; + _ -> + BodyStr = MapDataList + end, + agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/import">>, QueryPars, ?AgDefHeader, BodyStr). \ No newline at end of file diff --git a/src/agApi/agIndexes.erl b/src/agApi/agIndexes.erl index 67058c7..0a7f5ee 100644 --- a/src/agApi/agIndexes.erl +++ b/src/agApi/agIndexes.erl @@ -7,43 +7,33 @@ % doc_address:https://www.arangodb.com/docs/stable/http/indexes.html -% 索引的HTTP接口 +% 索引永久链接 +% 这是对 ArangoDB 的索引 HTTP 接口的一般介绍。有各种索引类型的特殊部分。 % 索引 -% 这是对ArangoDB索引的HTTP接口的一般介绍。有各种索引类型的特殊部分。 -% 索引 -% 索引用于允许快速访问文档。对于每个集合,总是有主索引,它是文档关键字(_key属性)的哈希索引 。不能删除或更改该索引。 边缘集合还将具有一个自动创建的边缘索引,该索引无法修改。该索引可通过_from和_to属性快速访问文档。 -% 可以通过定义应建立索引的属性名称来创建大多数用户土地索引。一些索引类型只允许索引一个属性(例如全文索引),而其他索引类型只允许索引多个属性。 -% _id任何索引类型均不支持在用户定义的索引中使用system属性。 - +% 索引用于允许快速访问文档。对于每个集合,总是有主索引,它是文档键(_key 属性)的哈希索引 。不能删除或更改此索引。 边缘集合还将具有自动创建的边缘索引,该索引无法修改。该索引通过_from和_to属性提供对文档的快速访问。 +% 大多数用户空间索引可以通过定义应该被索引的属性的名称来创建。一些索引类型只允许索引一个属性(例如全文索引),而其他索引类型允许索引多个属性。 +% _id任何索引类型都不支持在用户定义的索引中使用系统属性。 % 索引句柄 -% 索引句柄唯一地标识数据库中的索引。它是一个字符串,由集合名称和由/分隔的索引标识符组成。如果索引被声明为唯一,那么对索引属性的访问应该很快。如果索引属性仅包含很少的不同值,则性能会降低。 - -% 主索引 -% 将自动为每个集合创建一个主索引。它索引文档的主键,这些主键存储在_keysystem属性中。主索引是唯一的,可用于_key和_id属性的查询。无法显式创建或删除主索引。 - +% 索引句柄唯一标识数据库中的索引。它是一个字符串,由集合名称和以 / 分隔的索引标识符组成。如果索引被声明为唯一的,那么对索引属性的访问应该很快。如果索引属性仅包含很少的不同值,则性能会下降。 +% 一级索引 +% 为每个集合自动创建一个主索引。它索引文档的主键,这些主键存储在_key系统属性中。主索引是唯一的,可用于查询_key和_id属性。无法显式创建或删除主索引。 % 边缘索引 -% 将自动为边缘集合创建边缘索引。它包含顶点文档之间的连接,并在查询顶点的连接边时调用。无法显式创建或删除边缘索引。边缘索引是唯一的。 - -% 哈希指数固定链接 -% 哈希索引是未排序的索引,可用于通过相等查找查找单个文档。 -% -% 跳过清单索引固定链接 -% 跳过列表是可用于查找单个文档或文档范围的排序索引。 - -% 永久索引 -% 持久索引是可用于查找单个文档或文档范围的排序索引。与其他索引相反,持久索引的内容存储在磁盘上,因此在加载集合时不需要从文档在内存中重建。 - +% 为边集合自动创建边索引。它包含顶点文档之间的连接,并在查询顶点的连接边时调用。无法显式创建或删除边缘索引。边缘索引是非唯一的。 +% 哈希索引 +% 哈希索引是一种未排序的索引,可用于通过等式查找来查找单个文档。 +% 跳过列表索引 +% 跳过列表是一种排序索引,可用于查找单个文档或文档范围。 +% 持久索引 +% 持久索引是一种排序索引,可用于查找单个文档或文档范围。与其他索引相比,持久索引的内容存储在磁盘上,因此在加载集合时不需要在内存中从文档中重建。 % TTL(生存时间)索引 -% TTL索引可用于自动从集合中删除过期的文档。过期的文档最终将由后台线程删除。 - +% TTL 索引可用于自动从集合中删除过期文档。过期的文档最终会被后台线程删除。 % 全文索引 -% 全文索引可用于在文档中查找单词或单词前缀。全文索引只能在一个属性上设置,并且将对文档中包含的所有具有该属性文本值的单词进行索引。仅索引(指定)最小长度的单词。使用libicu提供的单词边界分析来完成单词标记化,该分析考虑了服务器启动时提供的所选语言。单词以小写形式索引。该索引支持完全匹配查询(全字)和前缀查询。 - +% 全文索引可用于在文档中查找单词或单词前缀。全文索引只能在一个属性上设置,并将索引包含在该属性中具有文本值的文档中的所有单词。只有具有(可指定的)最小长度的词才会被索引。单词标记化是使用 libicu 提供的单词边界分析完成的,它考虑了服务器启动时提供的所选语言。单词以其小写形式索引。索引支持全匹配查询(全词)和前缀查询。 % 索引地址 -% ArangoDB中的所有索引都有唯一的句柄。该索引句柄标识一个索引,并由ArangoDB管理。所有索引都在URI下找到 -% http://server:port/_api/index/index-handle -% 例如:假设索引句柄为demo / 63563528,则该索引的URL为: -% http://localhost:8529/_api/index/demo/63563528 +% ArangoDB 中的所有索引都有一个唯一的句柄。此索引句柄标识索引并由 ArangoDB 管理。所有索引都在 URI 下找到 +% http://server:port/_api/index/index-handle +% 例如:假设索引句柄是demo/63563528那么该索引的 URL 是: +% http://localhost:8529/_api/index/demo/63563528 % 返回索引 % GET /_api/index/{index-id} @@ -57,8 +47,8 @@ % 200:如果索引存在,则返回HTTP 200。 % 404:如果索引不存在,则 返回HTTP 404。 getIndexInfo(PoolNameOrSocket, IndexId) -> - Path = <<"/_api/index/", (agMiscUtils:toBinary(IndexId))/binary>>, - agVstCli:callAgency(PoolNameOrSocket, ?AgGet, Path). + Path = <<"/_api/index/", (agMiscUtils:toBinary(IndexId))/binary>>, + agVstCli:callAgency(PoolNameOrSocket, ?AgGet, Path). % 创建一个索引 % POST /_api/index#general @@ -72,10 +62,9 @@ getIndexInfo(PoolNameOrSocket, IndexId) -> % (可选)索引名称可以在name属性中指定为字符串。索引名称与集合名称具有相同的限制。如果未指定任何值,将自动生成一个值。 % 某些索引可以创建为唯一或非唯一变体。通过在索引详细信息中指定唯一标志,可以控制大多数索引的唯一性。将其设置为true将创建唯一索引。将其设置为false或忽略unique属性将创建一个非唯一索引。 % 注意:以下索引类型不支持唯一性,并且对这些类型使用unique属性可能会导致错误: -% 地理索引 -% 全文索引 +% 地理索引 +% 全文索引 % 注意:集群中不支持非分片键上的唯一索引。 -% % 可以选择在稀疏变量中创建哈希,跳过列表和持久索引。如果索引详细信息中的sparse属性设置为true,则将创建一个稀疏索引。稀疏索引不会索引未设置任何索引属性或为null的文档。 % % 类型为hash或skiplist的数组索引支持可选的重复数据删除属性。它控制将来自同一文档的重复索引值插入唯一数组索引是否会导致唯一约束错误。默认值为true,因此每个非唯一索引值的单个实例将插入每个文档的索引中。无论此属性的值如何,尝试将值插入到索引中已存在的索引始终将失败。 @@ -86,8 +75,7 @@ getIndexInfo(PoolNameOrSocket, IndexId) -> % 400:如果发布了无效的索引描述或使用了目标索引不支持的属性,则返回HTTP 400。 % 404:如果集合未知,则返回HTTP 404。 newIndex(PoolNameOrSocket, MapData, QueryPars) -> - BodyStr = eVPack:encodeBin(MapData), - agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/index">>, QueryPars, ?AgDefHeader, BodyStr). + agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/index">>, QueryPars, ?AgDefHeader, eVPack:encodeBin(MapData)). % 删除索引 % DELETE /_api/index/{index-id} @@ -98,8 +86,8 @@ newIndex(PoolNameOrSocket, MapData, QueryPars) -> % 200:如果可以删除索引,则返回HTTP 200。 % 404:如果index-id未知,则返回HTTP 404。 delIndex(PoolNameOrSocket, IndexId) -> - Path = <<"/_api/index/", (agMiscUtils:toBinary(IndexId))/binary>>, - agVstCli:callAgency(PoolNameOrSocket, ?AgDelete, Path). + Path = <<"/_api/index/", (agMiscUtils:toBinary(IndexId))/binary>>, + agVstCli:callAgency(PoolNameOrSocket, ?AgDelete, Path). % 返回集合的所有索引 % GET /_api/index @@ -109,7 +97,7 @@ delIndex(PoolNameOrSocket, IndexId) -> % 返回码 % 200:返回一个JSON对象,其中包含该集合的索引列表。 getIndexList(PoolNameOrSocket, QueryPars) -> - agVstCli:callAgency(PoolNameOrSocket, ?AgGet, <<"/_api/index">>, QueryPars). + agVstCli:callAgency(PoolNameOrSocket, ?AgGet, <<"/_api/index">>, QueryPars). % 使用哈希索引 % 如果存在合适的哈希索引,/_api/simple/by-example则将使用该索引执行示例查询。 @@ -134,93 +122,57 @@ getIndexList(PoolNameOrSocket, QueryPars) -> % 400:如果集合中已经包含文档,并且您尝试创建唯一哈希索引以使某些文档违反唯一性,则返回HTTP 400。 % 404:如果集合名称未知,则返回HTTP 404。 newIndexOfHash(PoolNameOrSocket, MapData, QueryPars) -> - BodyStr = eVPack:encodeBin(MapData), - agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/index">>, QueryPars, ?AgDefHeader, BodyStr). - - -% 返回与给定示例匹配的集合的所有文档 -% PUT /_api/simple/by-example -% 此路由不应再使用。从3.4.0版开始,不推荐使用简单查询的所有端点。它们被AQL查询取代。 -% 直到ArangoDB版本3.2.13和3.3.7,此API相当昂贵。一种更轻量的替代方法是使用HTTP Cursor API。从版本3.2.14和3.3.8开始,此性能影响不再是问题,因为API的内部实现已更改。 -% 具有以下属性的JSON对象是必需的: -% collection:要查询的集合的名称。 -% example:示例文档。 -% skip:查询中要跳过的文档数(可选)。 -% limit:要返回的最大文档数。该跳跃 是在之前应用极限的限制。(可选的) -% batchSize:一次往返从服务器传输到客户端的最大结果文档数。如果未设置此属性,则将使用服务器控制的默认值。甲BATCHSIZE的值 0是不允许的。 -% 这将找到与给定示例匹配的所有文档。 -% 返回包含结果的游标,有关详细信息,请参见HTTP Cursor。 -% 返回码 -% 201:查询执行成功返回。 -% 400:如果正文不包含查询的有效JSON表示形式,则返回。在这种情况下,响应主体包含一个错误文档。 -% 404:如果collection指定的collection未知,则返回。在这种情况下,响应主体包含一个错误文档。 - - -% 返回与给定示例匹配的集合的一个文档 -% PUT /_api/simple/first-example -% 此路由不应再使用。从3.4.0版开始,不推荐使用简单查询的所有端点。它们被AQL查询取代。 -% 直到ArangoDB版本3.2.13和3.3.7,此API相当昂贵。一种更轻量的替代方法是使用HTTP Cursor API。从版本3.2.14和3.3.8开始,此性能影响不再是问题,因为API的内部实现已更改。 -% 具有以下属性的JSON对象是必需的: -% collection:要查询的集合的名称。 -% example:示例文档。 -% 这将返回与给定示例匹配的第一个文档。 -% 如果没有文档与示例匹配,则返回包含文档或HTTP 404的结果。 -% 如果集合中有多个文档与指定的示例匹配,则仅返回其中一个文档,并且不确定返回哪个匹配的文档。 -% 返回码 -% 200:成功执行查询后返回。 -% 400:如果正文不包含查询的有效JSON表示形式,则返回。在这种情况下,响应主体包含一个错误文档。 -% 404:如果collection指定的collection未知,则返回。在这种情况下,响应主体包含一个错误文档。 + agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/index">>, QueryPars, ?AgDefHeader, eVPack:encodeBin(MapData)). % 使用跳过列表索引 -% 如果存在合适的跳过列表索引,则/_api/simple/range其他操作将使用该索引来执行查询。 - +% 如果存在合适的跳过列表索引,则/_api/simple/range和其他操作将使用该索引来执行查询。 +% 创建跳过列表 % 创建一个跳过列表 % POST /_api/index#skiplist % 查询参数 -% collection(必填):集合名称。 -% 具有以下属性的JSON对象是必需的: -% type:必须等于“ skiplist”。 -% fields:属性路径的数组。 -% unique:如果为true,则创建一个唯一索引。 -% sparse:如果为true,则创建一个稀疏索引。 -% deduplicate:如果为false,则关闭数组值的重复数据删除。 -% 为集合collection-name创建一个跳过列表索引(如果尚不存在)。该调用需要一个包含索引详细信息的对象。 -% 在稀疏索引中,所有不包含至少一个指定索引属性(即field)或在任何指定索引属性中都为null的文档将从索引中排除。如果设置了唯一标志,则不会对此类文档建立索引,也不会将其用于唯一性检查。 -% 在非稀疏索引中,将为这些文档建立索引(对于不存在索引的属性,将使用null值),并且如果设置了唯一标志,则将对它们进行唯一性检查。 +% collection(必填):集合名称。 +% 需要具有这些属性的 JSON 对象: +% type : 必须等于“skiplist”。 +% fields:属性路径数组。 +% unique : 如果为true,则创建唯一索引。 +% sparse:如果为true,则创建一个稀疏索引。 +% deduplicate:如果为false,则关闭数组值的重复数据删除。 +% 为集合collection-name创建一个跳过列表索引(如果它不存在)。该调用需要一个包含索引详细信息的对象。 +% 在稀疏索引中,所有不包含至少一个指定索引属性(即fields)或在任何指定索引属性中具有null值的文档都将从索引中排除。如果设置了唯一标志,此类文档将不会被编入索引,并且不会被考虑用于唯一性检查。 +% 在非稀疏索引中,这些文档将被索引(对于不存在的索引属性,将使用null值)并且如果设置了唯一标志,则将考虑唯一性检查。 % 注意:集群中不支持非分片键上的唯一索引。 -% 返回码 +% 返回代码 % 200:如果索引已经存在,则返回HTTP 200。 -% 201:如果索引尚不存在并且可以创建,则 返回HTTP 201。 -% 400:如果集合中已经包含文档,并且您尝试以存在违反唯一性的文档的方式创建唯一的跳过列表索引,则返回HTTP 400。 +% 201:如果索引不存在并且可以创建,则 返回HTTP 201。 +% 400:如果集合已经包含文档,并且您尝试以存在违反唯一性的文档的方式创建唯一的跳过列表索引,则返回HTTP 400。 % 404:如果集合名称未知,则返回HTTP 404。 newIndexOfSkipList(PoolNameOrSocket, MapData, QueryPars) -> - BodyStr = eVPack:encodeBin(MapData), - agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/index">>,QueryPars, ?AgDefHeader, BodyStr). + agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/index">>, QueryPars, ?AgDefHeader, eVPack:encodeBin(MapData)). % 使用持久索引 % 如果存在合适的持久索引,则/_api/simple/range其他操作将使用该索引执行查询。 -% -% 创建一个持久索引 +% 创建持久索引 % POST /_api/index#persistent % 查询参数 -% collection(必填):集合名称。 -% 具有以下属性的JSON对象是必需的: -% type:必须等于“ persistent”。 -% fields:属性路径的数组。 -% unique:如果为true,则创建一个唯一索引。 -% sparse:如果为true,则创建一个稀疏索引。 -% 为集合collection-name创建一个持久索引(如果尚不存在)。该调用需要一个包含索引详细信息的对象。 -% 在稀疏索引中,所有不包含至少一个指定索引属性(即field)或在任何指定索引属性中都为null的文档将从索引中排除。如果设置了唯一标志,则不会对此类文档建立索引,也不会将其用于唯一性检查。 -% 在非稀疏索引中,将为这些文档建立索引(对于不存在索引的属性,将使用null值),并且如果设置了唯一标志,则将对它们进行唯一性检查。 +% 集合(必填):集合名称。 +% 需要具有这些属性的 JSON 对象: +% type : 必须等于“persistent”。 +% fields:属性路径数组。 +% unique : 如果为true,则创建唯一索引。 +% sparse:如果为true,则创建一个稀疏索引。 +% deduplicate:属性deduplicate由类型persistent、 hash或skiplist 的数组索引支持。它控制将来自同一文档的重复索引值插入到唯一数组索引中是否会导致唯一约束错误。默认值为true,因此只有每个非唯一索引值的单个实例会插入到每个文档的索引中。尝试将值插入索引中已存在的索引将始终失败,无论此属性的值如何。 +% estimates:属性estimates由持久类型的索引支持。此属性控制是否为索引维护索引选择性估计。不保持索引选择性估计会对写入性能产生轻微的积极影响。关闭索引选择性估计的缺点是当有多个候选索引可供选择时,查询优化器将无法确定 AQL 查询中不同竞争索引的有用性。该估计属性是可选的,默认为真,如果没有设置。除了持久性(带有哈希和跳过列表)之外,它不会对索引产生任何影响 现在只是持久化的别名)。 +% 如果集合collection-name尚不存在,则为该集合创建持久索引。该调用需要一个包含索引详细信息的对象。 +% 在稀疏索引中,所有不包含至少一个指定索引属性(即fields)或在任何指定索引属性中具有null值的文档都将从索引中排除。如果设置了唯一标志,此类文档将不会被编入索引,并且不会被考虑用于唯一性检查。 +% 在非稀疏索引中,这些文档将被索引(对于不存在的索引属性,将使用null值)并且如果设置了唯一标志,则将考虑唯一性检查。 % 注意:集群中不支持非分片键上的唯一索引。 -% 返回码 -% 200:如果索引已经存在,则返回HTTP 200。 -% 201:如果索引尚不存在并且可以创建,则 返回HTTP 201。 -% 400:如果集合中已经包含文档,并且您尝试以存在违反唯一性的文档的方式创建唯一的持久索引,那么将返回HTTP 400。 -% 404:如果集合名称未知,则返回HTTP 404。 +% 返回代码 +% 200:如果索引已经存在,则返回HTTP 200。 +% 201:如果索引不存在并且可以创建,则 返回HTTP 201。 +% 400:如果集合已经包含文档,并且您尝试以存在违反唯一性的文档的方式创建唯一的持久索引,则返回HTTP 400。 +% 404:如果集合名称未知,则返回HTTP 404。 newIndexOfPersistent(PoolNameOrSocket, MapData, QueryPars) -> - BodyStr = eVPack:encodeBin(MapData), - agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/index">>,QueryPars, ?AgDefHeader, BodyStr). + agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/index">>, QueryPars, ?AgDefHeader, eVPack:encodeBin(MapData)). % 使用TTL(生存时间)索引 % @@ -238,9 +190,8 @@ newIndexOfPersistent(PoolNameOrSocket, MapData, QueryPars) -> % 201:如果索引尚不存在并且可以创建,则 返回HTTP 201。 % 400:如果集合已经包含另一个TTL索引,则返回HTTP 400,因为每个集合最多可以有一个TTL索引。 % 404:如果集合名称未知,则返回HTTP 404。 -newIndexOfTtl(PoolNameOrSocket, MapData, QueryPars) -> - BodyStr = eVPack:encodeBin(MapData), - agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/index">>,QueryPars, ?AgDefHeader, BodyStr). +newIndexOfTtl(PoolNameOrSocket, MapData, QueryPars) -> + agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/index">>, QueryPars, ?AgDefHeader, eVPack:encodeBin(MapData)). % 创建地理索引 % POST /_api/index#geo @@ -249,10 +200,9 @@ newIndexOfTtl(PoolNameOrSocket, MapData, QueryPars) -> % 具有以下属性的JSON对象是必需的: % type:必须等于“ geo”。 % fields:具有一个或两个属性路径的数组。 -% 如果它是一个具有一个属性路径location的数组,那么将使用location作为坐标的路径在所有文档上创建地理空间索引。该属性的值必须是具有至少两个double值的数组。数组必须包含纬度(第一个值)和经度(第二个值)。所有没有属性路径或值不适合的文档都将被忽略。 -% 如果它是具有两个属性路径latitude和经度的数组,则将使用纬度 和经度在所有文档上创建地理空间索引作为路径的纬度和经度。属性纬度和属性经度的值必须加倍。所有没有属性路径或值不适合的文档都将被忽略。 -% -% geoJson:如果在某个位置上构建了地理空间索引,并且geoJson为true,则数组内的顺序为经度和纬度。这对应于http://geojson.org/geojson-spec.html#positions中描述的格式 +% 如果它是一个具有一个属性路径location的数组,那么将使用location作为坐标的路径在所有文档上创建地理空间索引。该属性的值必须是具有至少两个double值的数组。数组必须包含纬度(第一个值)和经度(第二个值)。所有没有属性路径或值不适合的文档都将被忽略。 +% 如果它是具有两个属性路径latitude和经度的数组,则将使用纬度 和经度在所有文档上创建地理空间索引作为路径的纬度和经度。属性纬度和属性经度的值必须加倍。所有没有属性路径或值不适合的文档都将被忽略。 +% geoJson:如果在某个位置上构建了地理空间索引,并且geoJson为true,则数组内的顺序为经度和纬度。这对应于http://geojson.org/geojson-spec.html#positions中描述的格式 % 在集合collection-name中创建地理空间索引(如果尚不存在)。期望包含索引详细信息的对象。 % 地理位置索引总是稀疏的,这意味着不包含索引属性或索引属性中具有非数字值的文档将不会被索引。 % @@ -260,93 +210,23 @@ newIndexOfTtl(PoolNameOrSocket, MapData, QueryPars) -> % 200:如果索引已经存在,则返回HTTP 200。 % 201:如果索引尚不存在并且可以创建,则 返回HTTP 201。 % 404:如果集合名称未知,则返回HTTP 404。 -newIndexOfGeo(PoolNameOrSocket, MapData, QueryPars) -> - BodyStr = eVPack:encodeBin(MapData), - agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/index">>,QueryPars, ?AgDefHeader, BodyStr). - -%返回给定位置附近集合的所有文档 -%PUT /_api/simple/near -%此路由不应再使用。从3.4.0版开始,不推荐使用简单查询的所有端点。它们被AQL查询取代。 -%具有以下属性的JSON对象是必需的: -%collection:要查询的集合的名称。 -%latitude:坐标的纬度。 -%经度:坐标的经度。 -%distance:如果给定,则用于将距离返回给定坐标的属性键。(可选的)。如果指定,则以米为单位返回距离。 -%skip:查询中要跳过的文档数。(可选的) -%limit:要返回的最大文档数。该跳跃是在之前应用极限的限制。默认值为100。(可选) -%geo:如果给定,则为要使用的地理索引的标识符。(可选的) -%默认值将在给定坐标附近最多找到100个文档。返回的数组根据距离排序,最近的文档在返回数组中排在最前面。如果附近有等距离的文档,则从该组文档中随机选择文档,直到达到限制。 -%为了使用Near运算符,必​​须为集合定义一个地理索引。该索引还定义了哪个属性保存文档的坐标。如果您有多个地理空间索引,则可以使用geo字段来选择特定的索引。 -%返回包含结果的游标,有关详细信息,请参见HTTP Cursor。 -%注意:自ArangoDB 2.6起,不推荐使用近乎简单的查询。在将来的ArangoDB版本中可能会删除此API。使用Near运算符从集合中检索文档的首选方法是使用NEAR函数发出AQL查询,如下所示: -%FOR doc IN NEAR(@@collection, @latitude, @longitude, @limit) -%RETURN doc` -%返回码 -%201:查询执行成功返回。 -%400:如果正文不包含查询的有效JSON表示形式,则返回。在这种情况下,响应主体包含一个错误文档。 -%404:如果collection指定的collection未知,则返回。在这种情况下,响应主体包含一个错误文档。 - -% 查找坐标周围半径内的文档 -% 返回给定半径内集合的所有文档 -% PUT /_api/simple/within -% 此路由不应再使用。从3.4.0版开始,不推荐使用简单查询的所有端点。它们被AQL查询取代。 -% 具有以下属性的JSON对象是必需的: -% collection:要查询的集合的名称。 -% latitude:坐标的纬度。 -% 经度:坐标的经度。 -% radius:最大半径(以米为单位)。 -% distance:如果给定,则用于将距离返回给定坐标的属性键。(可选的)。如果指定,则以米为单位返回距离。 -% limit:要返回的最大文档数。该跳跃是在之前应用极限的限制。默认值为100。(可选) -% geo:如果给定,则为要使用的地理索引的标识符。(可选的) -% 这将找到围绕坐标(纬度,经度)的给定半径内的所有文档。返回的列表按距离排序。 -% 为了使用内部运算符,必​​须为集合定义一个地理索引。该索引还定义了哪个属性保存文档的坐标。如果您有多个地理空间索引,则可以使用geo字段来选择特定的索引。 -% 返回包含结果的游标,有关详细信息,请参见HTTP Cursor。 -% 注意:从ArangoDB 2.6开始不推荐使用内部简单查询。在将来的ArangoDB版本中可能会删除此API。使用Near运算符从集合中检索文档的首选方法是使用WITHIN函数发出AQL查询,如下所示: -% FOR doc IN WITHIN(@@collection, @latitude, @longitude, @radius, @distanceAttributeName) -% RETURN doc -% 返回码 -% 201:查询执行成功返回。 -% 400:如果正文不包含查询的有效JSON表示形式,则返回。在这种情况下,响应主体包含一个错误文档。 -% 404:如果collection指定的collection未知,则返回。在这种情况下,响应主体包含一个错误文档。 +newIndexOfGeo(PoolNameOrSocket, MapData, QueryPars) -> + agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/index">>, QueryPars, ?AgDefHeader, eVPack:encodeBin(MapData)). +% 全文 +% 如果存在全文索引, /_api/simple/fulltext则将使用该索引执行指定的全文查询。 % 创建全文索引 -% POST /_api/index#fulltext +% POST /_api/index#fulltext % 查询参数 -% collection (必填):集合名称。 -% 具有以下属性的JSON对象是必需的: -% type:必须等于“全文”。 -% fields:属性名称的数组。当前,数组仅限于一个属性。 -% minLength:要索引的单词的最小字符长度。如果未指定,则默认为服务器定义的值。因此,建议在创建索引时显式设置此值。 -% 为集合collection-name创建全文索引(如果尚不存在)。该调用需要一个包含索引详细信息的对象。 -% 返回码 -% 200:如果索引已经存在,则返回HTTP 200。 -% 201:如果索引尚不存在并且可以创建,则 返回HTTP 201。 -% 404:如果集合名称未知,则返回HTTP 404。 -newIndexOfFulltext(PoolNameOrSocket, MapData, QueryPars) -> - BodyStr = eVPack:encodeBin(MapData), - agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/index">>,QueryPars, ?AgDefHeader, BodyStr). - -% 全文索引查询 -% 通过全文查询返回集合的文档 -% PUT /_api/simple/fulltext -% 此路由不应再使用。从3.4.0版开始,不推荐使用简单查询的所有端点。它们被AQL查询取代。 -% 具有以下属性的JSON对象是必需的: -% collection:要查询的集合的名称。 -% attribute:包含文本的属性。 -% 查询:全文查询。请参阅全文查询 以获取详细信息。 -% skip:查询中要跳过的文档数(可选)。 -% limit:要返回的最大文档数。该跳跃 是在之前应用极限的限制。(可选的) -% index:要使用的全文索引的标识符。 -% 这将发现从集合匹配指定的全文查询的所有文档的查询。 -% 为了使用全文运算符,必​​须为集合和指定的属性定义全文索引。 -% 返回包含结果的游标,有关详细信息,请参见HTTP Cursor。 -% 注意:从ArangoDB 2.6起不推荐使用全文本简单查询。在将来的ArangoDB版本中可能会删除此API。使用Near运算符从集合中检索文档的首选方法是使用FULLTEXT AQL函数发出AQL查询 ,如下所示: -% FOR doc IN FULLTEXT(@@collection, @attributeName, @queryString, @limit) -% RETURN doc -% 返回码 -% 201:查询执行成功返回。 -% 400:如果正文不包含查询的有效JSON表示形式,则返回。在这种情况下,响应主体包含一个错误文档。 -% 404:如果collection指定的collection未知,则返回。在这种情况下,响应主体包含一个错误文档。 - - - +% collection(必填):集合名称。 +% 需要具有这些属性的 JSON 对象: +% type : 必须等于“fulltext”。 +% fields:属性名称数组。目前,该数组仅限于一个属性。 +% minLength:要索引的单词的最小字符长度。如果未指定,将默认为服务器定义的值。因此,建议在创建索引时明确设置此值。 +% 如果集合collection-name尚不存在,则为该集合创建全文索引。该调用需要一个包含索引详细信息的对象。 +% 返回代码 +% 200:如果索引已经存在,则返回HTTP 200。 +% 201:如果索引不存在并且可以创建,则 返回HTTP 201。 +% 404:如果集合名称未知,则返回HTTP 404。 +newIndexOfFulltext(PoolNameOrSocket, MapData, QueryPars) -> + agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/index">>, QueryPars, ?AgDefHeader, eVPack:encodeBin(MapData)). \ No newline at end of file diff --git a/src/agApi/agViews.erl b/src/agApi/agViews.erl index 0507939..d18c02d 100644 --- a/src/agApi/agViews.erl +++ b/src/agApi/agViews.erl @@ -64,8 +64,7 @@ % 400:如果name或type属性丢失或无效,则 返回HTTP 400错误。 % 409:如果已经存在一个名为name的视图,则返回HTTP 409错误。 newView(PoolNameOrSocket, MapData) -> - BodyStr = eVPack:encodeBin(MapData), - agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/view">>, ?AgDefQuery, ?AgDefHeader, BodyStr). + agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/view">>, ?AgDefQuery, ?AgDefHeader, eVPack:encodeBin(MapData)). % 返回一个视图 % GET /_api/view/{view-name} @@ -140,8 +139,7 @@ getViewProps(PoolNameOrSocket, ViewName) -> % 404:如果视图名称未知,则返回HTTP 404。 changeViewAllProps(PoolNameOrSocket, ViewName, MapData) -> Path = <<"/_api/view/", ViewName/binary, "/properties">>, - BodyStr = eVPack:encodeBin(MapData), - agVstCli:callAgency(PoolNameOrSocket, ?AgPut, Path, ?AgDefQuery, ?AgDefHeader, BodyStr). + agVstCli:callAgency(PoolNameOrSocket, ?AgPut, Path, ?AgDefQuery, ?AgDefHeader, eVPack:encodeBin(MapData)). % 部分更改ArangoSearch视图的属性 % PATCH /_api/view/{view-name}/properties#ArangoSearch @@ -178,8 +176,7 @@ changeViewAllProps(PoolNameOrSocket, ViewName, MapData) -> % 404:如果视图名称未知,则返回HTTP 404。 changeViewPartProps(PoolNameOrSocket, ViewName, MapData) -> Path = <<"/_api/view/", ViewName/binary, "/properties">>, - BodyStr = eVPack:encodeBin(MapData), - agVstCli:callAgency(PoolNameOrSocket, ?AgPatch, Path, ?AgDefQuery, ?AgDefHeader, BodyStr). + agVstCli:callAgency(PoolNameOrSocket, ?AgPatch, Path, ?AgDefQuery, ?AgDefHeader, eVPack:encodeBin(MapData)). % 重命名视图 % PUT /_api/view/{view-name}/rename @@ -195,10 +192,9 @@ changeViewPartProps(PoolNameOrSocket, ViewName, MapData) -> % 返回码 % 400:如果缺少视图名称,则返回HTTP 400。 % 404:如果视图名称未知,则返回HTTP 404。 -renameView(PoolNameOrSocket, ViewName, NewViewName) -> +renameView(PoolNameOrSocket, ViewName, MapData) -> Path = <<"/_api/view/", ViewName/binary, "/rename">>, - NameStr = eVPack:encodeBin(NewViewName), - agVstCli:callAgency(PoolNameOrSocket, ?AgPut, Path, [], <<"{\"name\":", NameStr/binary, "}">>). + agVstCli:callAgency(PoolNameOrSocket, ?AgPut, Path, ?AgDefQuery, ?AgDefHeader, eVPack:encodeBin(MapData)). % 删除视图 % DELETE /_api/view/{view-name}