Есть ли способ в MarkLogic запросить представление через REST API без написания кода для него на среднем уровне? - PullRequest
0 голосов
/ 06 июня 2019

У меня есть несколько документов в MarkLogic, все они принадлежат одной коллекции.Я создал шаблон, чтобы было создано представление, и записи документов можно запрашивать через это представление.Однако MarkLogic поддерживает запросы к представлениям только через SQL или OpticAPI.Я хочу запросить представление через REST API.Как это возможно?

Допустим, мои документы находятся по пути /employee//UUID.json.

Вот как был создан один документ и какие данные в нем содержатся:

declareUpdate();
xdmp.documentInsert("/employee/1586502/981723ioewqhdijsaduih3q8yeuiqwhdeqw.json",
{
      "EmployeeID": "1234567",
      "EmployeeName": "Lorem Ipsum",
      "JoiningDate": "2018-07-01"
    },
xdmp.defaultPermissions(),
[
  "EmployeeRecordCollection"
])

Ниже приведено определение шаблона:

'use strict'
var tde = require("/MarkLogic/tde.xqy");
var EmployeeRecordTDE = xdmp.toJSON(
  {
    "template": {
      "context": "/",
      "collections": ["EmployeeRecordCollection"],
      "rows": [
        {
          "schemaName": "employees",
          "viewName": "EmployeeRecordView",
          "columns": [
            {
              "name": "employeeId",
              "scalarType": "string",
              "val": "EmployeeID"
            },
            {
              "name": "rateType",
              "scalarType": "string",
              "val": "EmployeeName",
            },
            {
              "name": "startDate",
              "scalarType": "string",
              "val": "JoiningDate"
            }
          ]
        }
      ]
    }
  }
);
tde.validate( 
  [EmployeeRecordTDE]
);

tde.nodeDataExtract( 
  [fn.collection(["EmployeeRecordCollection"])],
  [EmployeeRecordTDE]
);

tde.templateInsert(
  "/employee/EmployeeRecordTDE.json" ,
  EmployeeRecordTDE,
  xdmp.defaultPermissions(),
  ["EmployeeRecordCollection"]
)

Приведенный выше шаблон создает представление с именем «EmployeeRecordView», которое можно запросить с помощью SQL как:

select * from EmployeeRecordView where...;

Можетбыть преобразованным в план с использованием OpticAPI в Javascript следующим образом:

declareUpdate();
const op = require('/MarkLogic/optic');

const EmployeePlanSQL =
   op.fromSQL("select * from EmployeeRecordView")
const planObj = EmployeePlanSQL.export();

xdmp.documentInsert("emplRatePlanSQL.json", planObj);

op.import(cts.doc('emplRatePlanSQL.json').toObject())
  .result();

Я подумал, что, возможно, я смогу использовать этот план для предоставления REST API в MarkLogic, чтобы у меня не было запросов в коде моего приложения.MarkLogic предоставляет способ для этого, НО все определение плана должно быть передано как запрос в REST API, что опять-таки нежелательно.

http://localhost:8040/v1/rows?plan=...

Кроме того, большое желание не хранить запросы вкод приложения.Есть ли способ представить этот план как REST API через функцию JS в MarkLogic или каким-либо другим подходом?

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Я использовал REST API Extension для достижения этой цели, так как хотел избежать среднего уровня.

Это URL, который я нажал

http://localhost:8040/LATEST/config/resources/employees?version=1.0&provider=yourTeam&method=get

с заголовком HTTP:

Content-Type: application/vnd.marklogic-javascript

со следующим телом:

function get(context, params) {
  context.outputStatus = [201, 'Yay'];
  const op = require('/MarkLogic/optic');
  return op.import(cts.doc('emplRatePlanSQL.json').toObject()).result();
}

// Include an export for each method supported by your extension.
exports.GET = get;

Вывод, однако, не отформатирован как массив записей JSON. Это избавляет меня от необходимости избегать среднего уровня и сохраняет много Java-кода.

Теперь я могу вызвать этот план, просто вызвав этот URI (HTTP GET):

http://localhost:8040/LATEST/resources/employees

Спасибо за помощь!

0 голосов
/ 07 июня 2019

В более раннем ответе я не понимал, что цель состоит в том, чтобы инкапсулировать запрос и только передать критерии.

Если средний уровень написан на Java, один из подходов состоит в том, чтобы определить Службу данных, которая принимает критерии для плана и инкапсулирует запрос в конечной точке:

http://docs.marklogic.com/guide/java/DataServices

В противном случае вы можете использовать расширение службы ресурсов, которое инкапсулирует запрос:

http://docs.marklogic.com/guide/rest-dev/extensions#id_59188

И API Java, и API Node.js предоставляют интерфейс для расширений службы ресурсов. Они также могут вызываться на отдыхе:

http://docs.marklogic.com/REST/client/service-extension

Надеюсь, что это более полезно,

...