Я устанавливаю расширение REST в MarkLogic для запроса представления. Как я могу создать этот запрос GET, чтобы он мог принимать критерии типа> и <для дат? - PullRequest
0 голосов
/ 11 июня 2019

Этот вопрос больше относится к дизайну REST URL, чтобы я мог пройти критерии для дат, когда мне нужно искать <или> определенную дату. Кроме того, это будет расширение REST в MarkLogic, которое будет вызывать SQL-запрос по очереди над представлением. Таким образом, критерии, переданные в параметре запроса, будут служить критерием для запроса SQL.

Вот мой документ:

{
      "EmployeeID": "1234567",
      "EmployeeName": "Lorem Ipsum",
      "JoiningDate": "2018-07-01"
}

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

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": "employeeName",
              "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"]
)

Я думаю о том, чтобы запросить вид сверху примерно так:

op.fromView('employees', 'EmployeeRecordView',"")
     .select(['employeeId', 'employeeName', 'startDate'])
     .where(op.eq(op.col('employeeId'), op.param('emplId')))
     .orderBy('employeeId');

или может быть таким:

op.fromSQL("select * from EmployeeRecordView where employees.EmployeeRecordView.employeeId=12345","")

Я могу использовать Optic API через Javascript или использовать SQL внутри расширения REST, в зависимости от того, что лучше всего работает. Мне просто нужна возможность передавать параметры запроса для различных критериев SQL.

Допустим, мое расширение REST определено как

http://localhost:8040/LATEST/config/resources/employees?method=get&get:emplId=integer&get:name=string

У меня может быть REST-URL для соответствия критериям «=» и «in», например:

http://localhost:8040/LATEST/resources/employees?rs:name='John','Brad'&rs:emplId=1234567

Не знаете, как передавать параметры для сценариев поиска между и датами, которые могут работать с MarkLogic.

1 Ответ

1 голос
/ 11 июня 2019

Optic предоставляет функцию op.sqlCondition () для фильтрации набора строк Optic на основе простого выражения SQL.См .:

http://docs.marklogic.com/op.sqlCondition

Передача простого выражения лучше, чем передача всего SQL-запроса от клиента, поскольку это снижает вероятность атак SQL-инъекцией.

Расширение службы ресурсов REST может принимать один параметр, который имеет строку для передачи в op.sqlCondition ().

Предпочтительным подходом будет параметризация строкового аргумента - как в op.sqlCondition(op.param('filterExpr')), поэтомусервер может кэшировать запрос.

Надеемся, что поможет,

...