메인 컨텐츠로 가기
무엇을 어떻게 도와드릴까요?

답변을 검색하거나 지식 기반을 찾아보세요.

문서    튜토리얼    고객 지원

목차
<모든 주제
인쇄

VAIL 참조 가이드

 

회사 개요

Vantiq는 이벤트 기반 애플리케이션(EDA) 구축 플랫폼입니다. EDA는 이벤트 형태의 데이터 스트림을 지속적으로 처리하고, 해당 데이터를 활용하여 정보를 도출하고, 애플리케이션 데이터 모델의 상태를 변경하고, 의사 결정을 내립니다. EDA는 새로운 이벤트 발생 시 지속적으로 반응하기 때문에 "반응형 애플리케이션"이라고도 합니다. Vantiq는 규칙, 서비스 및 절차를 사용하여 EDA를 구축합니다.

  • 규칙 - A 지배 새 애플리케이션 데이터 도착, 애플리케이션 데이터 모델 상태 변경, 타이머 만료 등의 이벤트에 의해 트리거됩니다. 트리거되면 규칙 본문이 실행됩니다. 트리거 이벤트는 규칙 본문에 매개변수로 제공됩니다.
  • 서비스 - A 서비스 특정 애플리케이션 작업을 수행하는 데 필요한 동작을 캡슐화합니다. 여기에는 해당 작업에 필요하거나 생성된 모든 데이터에 대한 액세스, 이벤트 생성 및 소비가 포함됩니다. 서비스는 하나 이상의 절차 및 / 또는 이벤트 유형서비스는 원격으로도 접근이 가능하므로, 한 애플리케이션에서 다른 애플리케이션이 제공하는 서비스를 이용할 수 있습니다.
  • 절차 - A 순서 0개 이상의 매개변수와 선택적 반환 값을 정의합니다. 호출 시 제공된 매개변수 값을 사용하여 프로시저 본문이 실행됩니다.

규칙, 서비스 및 절차는 애플리케이션 데이터 모델의 컨텍스트에서 작동하며, 현재 상태를 쿼리하고, 해당 상태의 변경을 알리는 이벤트를 수신하며, 자체적으로 변경을 수행합니다. 애플리케이션 데이터 모델은 Vantiq 플랫폼에서 관리하는 메모리 내 데이터와 영구 데이터, 그리고 외부 시스템의 데이터로 구성됩니다. 애플리케이션 데이터 모델을 설명하는 데 사용되는 리소스는 다음과 같습니다.

  • 유형 - A 유형 애플리케이션에서 처리되는 데이터의 구조(스키마라고도 함)를 설명합니다. 여기에는 이벤트에 포함된 데이터, 서비스에서 처리되는 데이터, 그리고 영구적으로 저장되는 데이터가 포함됩니다.
  • 주제 - A 화제 이벤트를 게시하고 수신할 수 있는 애플리케이션 정의 채널입니다.
  • 소스 - A   외부 시스템에 대한 연결을 정의합니다. 이를 통해 애플리케이션은 해당 시스템에서 생성된 이벤트를 수신하고, 해당 시스템에 이벤트를 게시하고, 해당 시스템의 현재 상태를 쿼리할 수 있습니다.

규칙, 서비스 및 절차는 언어에서 제공하는 공통 선언적 구성 요소 집합을 사용하여 구성됩니다. 내리다. VAIL은 다음과 같습니다.

  • 이벤트 기반 애플리케이션을 구축하기 위한 학습 곡선을 단순화하도록 설계된 도메인 특정 언어(DSL)입니다.
  • 애플리케이션의 데이터 모델의 지속적 부분에 접근하기 위한 내장 SQL을 지원하는 JavaScript와 유사한 언어입니다.
  • 런타임에 강제되는(일명 "덕") 타이핑을 사용하는 동적 언어입니다.

이 문서는 VAIL에 대한 참조 매뉴얼로, VAIL을 사용하여 EDA를 구성하는 규칙, 서비스 및 절차를 구성하는 방법을 설명합니다.

패키지

패키지는 관련 애플리케이션 리소스 집합을 구성하는 범위/그룹화 메커니즘입니다. 개념적으로 패키지는 컴퓨터의 여러 폴더와 유사하다고 생각할 수 있습니다. HTML 페이지는 한 폴더에, 이미지는 다른 폴더에, 스크립트나 애플리케이션은 또 다른 폴더에 보관할 수 있습니다. EDA는 여러 리소스로 구성될 수 있으므로, 관련 리소스를 패키지에 넣어 체계적으로 관리하는 것이 좋습니다.

프로그래머는 애플리케이션 리소스 그룹을 묶기 위해 자체 패키지를 정의할 수 있습니다. 프로그래머가 구현한 관련 리소스들을 그룹화하면 프로그래머가 리소스들이 서로 연관되어 있음을 쉽게 파악할 수 있습니다.

각 패키지는 포함된 리소스에 대해 새로운 "이름 범위"를 생성합니다(패키지 없이 존재하는 "전역" 범위와는 다름). 따라서 다른 패키지의 이름과 이름 충돌이 발생하지 않습니다. 패키지를 사용하면 관련 리소스를 더 쉽게 찾고 재사용할 수 있습니다.

패키지 선언

패키지 이름은 두 개 이상으로 구성됩니다. 식별자 "점"으로 구분됨 (.) 문자, 예: com.mycompany.myapp. "단순" 패키지 이름(예: "점"이 없는 이름) 내 패키지)은 허용되지 않습니다. 여러 회사 간에 공유될 수 있는 패키지 간의 충돌을 방지하기 위해 다음과 같은 명명 규칙을 권장합니다.

  • 패키지 이름은 다른 리소스 이름과 충돌을 피하기 위해 모두 소문자로 작성됩니다.
  • 기업들은 패키지 이름을 시작할 때 인터넷 도메인 이름을 역순으로 사용합니다. 예를 들어, com.example.mypackage 이름이 지정된 패키지의 경우 내 패키지 프로그래머가 만든 example.com.
  • 단일 회사 내에서 발생하는 이름 충돌은 해당 회사 내에서 관례에 따라 처리해야 합니다. 예를 들어 회사 이름 뒤에 지역이나 프로젝트 이름을 포함하는 방법이 있습니다(예: com.example.region.mypackage).
  • Vantiq에서 제공하는 패키지는 항상 다음으로 시작됩니다. io.vantiq (예약되어 사용할 수 없음).

경우에 따라 인터넷 도메인 이름이 유효한 패키지 이름이 아닐 수 있습니다. 도메인 이름에 하이픈이나 기타 특수 문자가 포함되어 있거나, 패키지 이름이 식별자 시작 부분으로 사용할 수 없는 숫자나 기타 문자로 시작하거나, 패키지 이름에 다음과 같은 예약된 Java 키워드가 포함된 경우 이러한 문제가 발생할 수 있습니다. int이 경우, 밑줄을 추가하는 것이 좋습니다. 예:

도메인 이름 패키지 이름 접두사
하이픈으로 연결된 이름.example.org org.example.하이픈_이름
예제.int int_.예제
123name.example.com com.example._123name

패키지에 VAIL 리소스 배치

VAIL 리소스는 다음을 사용하여 패키지에 있는 것으로 선언됩니다. 패키지 설명. 이 항목이 있는 경우, 리소스를 선언하는 VAIL 텍스트의 첫 번째 비주석 줄이어야 합니다. 예:

// A top level comment is OK here
package com.company.factory.robots

rule processSensorData
when event occurs on "/topics/sensor"
... rest of rule definition ...

여기서 우리는 규칙을 정의하고 있습니다 프로세스센서데이터 패키지에 com.company.factory.robots.

패키지에 데이터 모델 리소스 배치

The 애플리케이션 데이터 모델 리소스 패키지 이름을 리소스 이름 앞에 붙여서 패키지에 있는 것으로 선언됩니다(점(.)으로 구분)..)). 예를 들어, 이름이 있는 유형을 만듭니다. com.company.factory.robots.Sensor 유형을 선언합니다 감지기 패키지에 com.company.factory.robots.

Modelo는 간단한 이름을 제시합니다(감지기) 및 패키지(com.company.factory.robots.Sensor)가 기본 리소스 모델에 단일의 정규화된 이름으로 저장되어 있더라도 두 개의 서로 다른 필드에 존재합니다.

패키지에서 토픽을 선언할 때 패키지 이름은 토픽의 첫 번째 경로 세그먼트에 포함됩니다. 예를 들어, 토픽은 /com.company.factory.robots/sensor 주제를 선언합니다 /감지기 패키지에 com.company.factory.robots.

패키지 범위 지정 및 이름 확인

선언된 모든 리소스에 대한 패키지를 정의하는 것 외에도 패키지 설명 참조된 리소스의 기본 해상도도 변경합니다. 정규화되지 않은 이름을 전역 범위에 있는 것으로 처리하는 대신, 선언된 패키지의 범위에 있는 것으로 간주합니다. 예를 들면 다음과 같습니다.

// A top level comment is OK here
package com.company.factory.robots

rule processSensorData
when event occurs on "/topics/sensor"

var robotStatus = select exactly one from Robots where id == event.value.robotId

위 규칙은 주제를 참조합니다. /감지기 그리고 유형 로봇. 각각의 경우 이러한 참조는 패키지 범위로 자동으로 정규화됩니다. com.company.factory.robots. 결과적으로 시스템은 패키지(그리고 패키지 내에서만)에서 이러한 리소스를 찾고, 패키지가 없는 경우처럼 전역 범위에서 리소스를 찾지 않습니다.

다른 범위의 리소스 참조

로컬 패키지(패키지 명령문에 선언된 패키지) 외부의 리소스는 정규화된 이름을 사용하여 참조할 수 있습니다. 하지만 이렇게 하면 코드가 매우 복잡해집니다. 또한, 전역 범위의 리소스는 "정규화된" 형식이 간단한 이름과 동일하기 때문에 이런 방식으로 참조할 수 없습니다. 수입 신고서 이 두 가지 문제를 모두 해결하는 데 사용할 수 있습니다.

사용 년 수입 신고서 리소스 인스턴스를 간단한 이름(일반적으로 마지막 "." 뒤의 부분) 또는 지정된 별칭(제공된 경우)을 사용하여 참조할 수 있도록 합니다. 예를 들어, 유형을 참조하려면 com.company.factory.robots.로봇 다른 패키지에서 com.company.factory.robots 다음의 import 문을 사용할 수 있습니다:

import type com.company.factory.robots.Robots

이렇게 하면 기호를 사용하여 유형을 참조할 수 있습니다. 로봇. 이 가져오기 문은 다음과 같습니다.

import type com.company.factory.robots.Robots as Robbie

기호를 사용하여 유형을 참조할 수 있습니다. 로비.

동일한 리소스에 대한 두 개 이상의 가져오기에서 동일한 별칭을 사용하는 것은 허용되지 않습니다. 또한 기존 로컬 이름과 겹치는 별칭을 사용하는 것도 허용되지 않습니다. 가져온 리소스 인스턴스와 로컬 리소스 인스턴스 또는 가져온 두 리소스 간의 겹침을 해결하는 경우를 제외하고는 별칭 사용은 선택 사항입니다. 이러한 경우, 이러한 겹침을 방지하기 위해 별칭이 필요합니다. 예를 들어, 이름이 다음과 같은 로컬 유형이 있는 경우 로봇 그러면 다음의 수입은 불법입니다:

import type com.company.factory.robots.Robots

마찬가지로, 다음 두 가지 가져오기는 구별할 별칭이 없다면 불법입니다.

import type com.company.factory.robots.Robots
import type com.company.space.Robots

글로벌 리소스는 가져오기를 사용하여 참조할 수도 있습니다. 다음 가져오기는 다음과 같습니다.

import type Robots

유형에 대한 액세스를 제공합니다 로봇 글로벌 관점에서.

VAIL 선언

규칙서비스글렌데일 절차 리소스의 VAIL 선언을 제출하여 생성됩니다. 규칙 또는 프로시저의 본문은 다음 시퀀스로 구성됩니다. VAIL 진술서.

VAIL 구문 및 의미론에 대한 전체 설명은 다음에서 찾을 수 있습니다. VAIL 구문 및 의미론.

규칙

규칙은 애플리케이션 데이터 모델과 관련된 이벤트가 발생할 때 애플리케이션이 응답할 수 있는 방법을 제공합니다. 이러한 이벤트는 외부 시스템에서 데이터가 도착하거나, 다른 애플리케이션에서 데이터가 수신되거나, 애플리케이션의 영구 데이터가 변경되는 것을 나타낼 수 있습니다.

규칙 선언은 다음으로 구성됩니다. RULE 키워드 뒤에 규칙 이름, 버전(선택 사항), 선택 기준(선택 사항), 활성화 제약 조건(선택 사항), 트리거 조건, 그리고 규칙 본문을 나타내는 VAIL 명령문 세트가 옵니다. RULE 명령문의 구문은 다음과 같습니다.

RULE <name>[:<version> WHERE <versionSelectionCriteria>] [ACTIVATIONCONSTRAINT <activationConstraint>]
WHEN <triggeringCondition>
[VAIL Statement]*

의 세부 사항 name버전버전 선택 기준활성화 제약글렌데일 when 절 아래에 설명되어 있습니다.

예 :

RULE myFirstRule
WHEN EVENT OCCURS ON "/types/Order/insert"

var order = event.value
for (mgr in SELECT ONE * FROM Employee WHERE name == order.salesPersonManager) {
    PUBLISH { message: "There is an order for your review: " + order.orderId }
        TO SOURCE corporateEmail
        USING { recipients: [mgr.emailAddress] }

    if (order.customerName == "myFavoriteCustomer") {
        applyDiscount("10%", order)
    }
}

규칙은 지정된 대로 "myFirstRule"로 명명됩니다. RULE 성명서.

트리거 조건은 다음과 같습니다. INSERT 로 주문번호 지정된 리소스 WHEN 절. 주문 인스턴스는 다음과 같이 나타납니다. 암묵적 변수 이름 주문 (대소문자 구분) 후속 규칙 설명에서 사용할 수 있습니다.

The SELECT 성명서 영업 담당자의 관리자를 검색합니다. 주문. 관리자가 존재하는 경우 본문 FOR 성명서 으로 실행됩니다. 종업원 로컬 변수에 할당된 관리자를 나타내는 인스턴스 mgr.

블록의 첫 번째 문장은 관리자에게 주문 승인을 요청하는 이메일을 보냅니다.

두 번째 문장은 고객 이름이 "myFavoriteCustomer"인 경우 시스템이 전화를 걸어 주문에 10% 할인을 적용한다는 것을 나타냅니다. 적용할인 순서.

이 예와 이후의 모든 예에서 규칙은 JavaScript 스타일 키워드에는 소문자를 사용하고 모든 SQL 스타일 키워드에는 대문자를 사용하는 것입니다(그러나 모든 VAIL 키워드 (대소문자를 구분하지 않습니다).

규칙 이름

규칙 이름은 영숫자와 밑줄로 구성될 수 있습니다. 규칙 이름은 알파벳 또는 밑줄로 시작해야 합니다. 숫자로 시작할 수는 없습니다. 또한, 로 시작하는 모든 이름은 ars_ 시스템 사용을 위해 예약되어 있습니다.

규칙은 버전 관리가 가능하며, 여러 버전의 규칙을 동시에 정의할 수 있습니다. 이름에 포함된 경우, 콜론(':') 문자는 버전 번호를 구분합니다. 콜론 앞의 문자열은 규칙의 고유 이름으로 간주됩니다. 콜론 뒤의 문자열은 버전 번호로 간주됩니다. 버전은 아래 하위 섹션에서 설명하는 것처럼 특별한 의미를 갖습니다. 버전 번호에는 영숫자, '.', '-', '_' 문자가 포함될 수 있습니다.

이름과 버전 식별자를 모두 포함하는 완전히 지정된 이름의 예는 다음과 같습니다. myRule:02.03.044. 규칙의 이름은 다음과 같습니다. myRule. 규칙의 버전은 다음과 같습니다. 02.03.044.

버전 관리

EDA에서 처리하는 데이터가 변경됨에 따라 EDA 유지 관리를 간소화하기 위해 규칙을 버전 관리할 수 있습니다. 버전 번호만 다른 규칙 모음은 동일한 규칙으로 간주되며, 트리거 이벤트 발생 시 해당 모음에서 하나의 규칙만 평가됩니다.

기본적으로 "최신" 규칙 버전은 이벤트에 대한 응답으로 활성화됩니다. 그러나 WHERE 조항에 대한 이벤트 바인딩더욱 정교한 동작을 구현할 수 있습니다. 예를 들어, 새로운 버전의 규칙을 도입하되 제한된 트리거 이벤트 집합(예: 특정 테스트 데이터 집합과 관련된 이벤트)에만 적용하는 것이 바람직할 수 있습니다.

평가는 다음과 같이 진행됩니다.

  • 이벤트가 발생하면 규칙 디스패처는 해당 규칙의 최신 버전을 평가합니다.
  • 경우 이벤트 바인딩 제약 조건이 없습니다(a를 통해) WHERE 조항), 규칙의 버전은 무조건적으로 평가됩니다.
  • 규칙 문에 다음이 포함되어 있는 경우 WHERE 절, 절이 평가됩니다.
  • 경우 WHERE 절이 참으로 평가되면 규칙은 완전히 평가됩니다.
  • 경우 WHERE 절이 거짓으로 평가되면, 이 버전의 규칙은 삭제되고 규칙의 다음으로 "가장 최근" 버전이 선택되어 평가됩니다.

이 프로세스는 평가할 수 있는 규칙 버전을 찾을 때까지 또는 모든 버전이 평가 제약 조건을 통과하지 못할 때까지 계속됩니다.

규칙의 "최신" 버전이라는 개념은 대소문자를 구분하지 않고 버전 번호를 어휘적으로 정렬하여 결정하는데, 어휘적으로 가장 큰 값이 가장 최신 또는 가장 최근의 것으로 간주되고 어휘적으로 가장 작은 값이 가장 오래된 것으로 간주됩니다.

버전 번호의 어휘 순서는 아래와 같습니다.

  • 02.03.044
  • 02.01.033
  • 01.01.02
  • 01.00.04
  • 0.0.0

피해야 할 엉뚱한 사례가 있으므로 주의가 필요합니다. 예를 들어, 숫자 값에 따라 규칙을 정렬하면 다른 순서가 되겠지만, 다음의 어휘 순서는 정확하게 표현됩니다.

  • 1.00.00
  • 02.00.00

이러한 의도치 않은 의외의 순서 지정을 없애기 위해 모든 버전 식별자에 동일한 문자 수가 포함되도록 고정된 형식으로 버전을 지정하는 것이 좋습니다.

예를 들어, 다음 두 가지 버전의 규칙이 주어졌습니다.

RULE myRule:V1
WHEN EVENT OCCURS ON "/types/Employee/insert"
...

RULE myRule:V2 WHERE event.value.salary < 100
WHEN EVENT OCCURS ON "/types/Employee/insert"
...

다음 INSERT 평가를 시작합니다 내 규칙:V1:

INSERT Employee(name: "Harriet", salary: 1000)

그러나 다음 INSERT 평가를 시작합니다 내 규칙:V2:

INSERT Employee(name:"Stanley", salary: 50)

규칙의 모든 버전 MUST 같은 것에 의해 유발되다 WHEN 절. 오직 WHERE 조항 이벤트 바인딩 동일한 규칙 세트의 버전마다 다를 수 있습니다.

활성화 제약

규칙은 활성화 제약 조건을 선언할 수 있습니다. 활성화 제약 조건은 다음에 의해 사용됩니다. 배포 도구 규칙을 대상에 활성 또는 비활성으로 설치해야 하는지 여부를 결정합니다. 노드기본적으로 각 규칙은 배포된 각 노드에 기본 상태로 프로비저닝됩니다. 그러나 특정 노드에서는 규칙을 활성 상태로 프로비저닝하고 다른 모든 노드에서는 비활성 상태로 프로비저닝해야 하는 경우가 있을 수 있습니다. 이 경우 활성화 제약 조건을 사용하여 이를 구현할 수 있습니다.

활성화 제약 조건은 규칙이 배포된 각 노드의 리소스 인스턴스에 적용됩니다. 제약 조건이 true로 평가되면 규칙은 해당 노드에서 활성화되도록 구성됩니다. 제약 조건이 false로 평가되면 규칙은 비활성화되도록 구성됩니다. 활성화 제약 조건은 쿼리 제약 조건(일명 WHERE (조항)을 평가할 수 있습니다. 노드 리소스입니다. 예를 들어, 다음과 같은 활성화 제약 조건이 주어졌습니다.

{
    "ars_properties.status": "experimental"
}

이 규칙은 노드 리소스에 "status" 속성과 "experimental" 값이 있는 시스템에서만 활성화됩니다. 이렇게 하면 "experimental" 시스템을 제외한 모든 시스템에서 규칙을 비활성화할 수 있습니다.

WHEN 절

WHEN 절은 규칙의 트리거 조건을 지정하는 데 사용됩니다. 규칙 본문이 실행되기 위해 발생해야 하는 이벤트와 충족해야 하는 조건(있는 경우)을 지정합니다. 트리거 조건이 두 개 이상의 이벤트를 지정하는 경우, 관련된 모든 이벤트가 수신되어 평가된 후에만 규칙이 트리거됩니다. 트리거 조건이 충족되면 규칙 본문이 평가됩니다. 트리거 조건이 충족되지 않으면 규칙은 해제됩니다.

공식 구문은 다음과 같습니다.

whenClause := WHEN <triggeringCondition>

triggeringCondition := <eventBinding> [<eventCorrelation>] [<expectation>] | <eventMerge>

eventCorrelation := <temporalOperator> <triggeringCondition> WITHIN <windowInterval> 
    [<correlationConstraint>]

eventMerge := <eventBinding> OR <triggeringCondition> [<correlationConstraint>] [<expectation>]

correlationConstraint := CONSTRAIN TO <queryCondition>

expectation := EXPECT (EVERY | WITHIN) <intervalLiteral>

eventBinding := EVENT OCCURS ON <eventPath> [AS <alias>] [ WHERE <eventCondition>]

temporalOperator := BEFORE | AFTER | AND

windowInterval := ... any interval literal ...

eventCondition := ... logical expression over event instance ...

queryCondition := ... logical expression over correlated event instances ...

이벤트 바인딩

Vantiq의 모든 이벤트는 애플리케이션 데이터 모델의 특정 리소스 인스턴스에서 발생합니다. 이벤트는 해당 인스턴스에서 수행된 작업을 나타냅니다. 이벤트를 생성할 수 있는 리소스는 다음과 같습니다.

  • 유형 - Vantiq 자동화 모델에 정의된 유형은 이벤트를 생성합니다. INSERTUPDATE글렌데일 DELETE 작업.
  • 소스 – Vantiq 소스는 소스가 메시지를 수신할 때마다 이벤트를 생성합니다.
  • 주제 - 주제는 모든 이벤트를 생성합니다. PUBLISH 해당 주제에 대해 수행된 작업.
  • 서비스 - 서비스는 다음을 정의할 수 있습니다. 배 밖으로 서비스 구현에 따라 결정되는 의미론에 따라 이벤트를 생성하는 이벤트 유형입니다.

규칙은 다음 형식의 이벤트 바인딩을 사용하여 이러한 이벤트에 바인딩됩니다.

EVENT OCCURS ON <eventPath> [AS <alias>] [ WHERE <eventCondition>]

The eventPath 하는 String 문자 다음 형식으로: /<resource>/<instance id>[/<operation>]. 이는 각 이벤트를 해당 이벤트가 나타내는 리소스, 인스턴스 및 작업을 기준으로 분류합니다. operation 소스와 주제 모두 가능한 작업이 하나뿐이므로 유형 이벤트에만 필요합니다.

The alias 이벤트 객체에 바인딩된 대체 변수 이름을 식별합니다. 별칭을 지정하지 않으면 이벤트는 로컬 변수에 바인딩됩니다. event런타임에 바인딩된 변수에는 처리 중인 이벤트 인스턴스가 포함됩니다.

이벤트에는 다음 속성이 있습니다.

  • uuid – 특정 이벤트 인스턴스에 대한 고유 식별자.
  • 경로 – 이벤트의 경로(위에서 설명한 대로).
  • 값 - 이벤트와 관련된 데이터입니다. 이 속성의 형식은 리소스 및 작업에 따라 달라집니다. 다양한 데이터 형식은 아래 리소스별 바인딩 섹션에서 설명합니다.
  • createdAt – 이벤트가 생성된 날짜 및 시간.
  • 주제 – MQTT, AMQP 및 Kafka 소스의 경우 이벤트가 게시된 주제

선택적 WHERE 절은 규칙을 활성화하기 전에 평가를 트리거하는 이벤트가 충족해야 하는 쿼리 조건을 지정합니다. 이 표현식의 형식은 다음 표현식에서 사용하는 형식과 동일합니다. WHERE 절 의 SELECT 작동.

사건 상관 관계

트리거 조건 WHEN 절 두 개 이상의 이벤트를 상관시켜 규칙 평가를 트리거할 수 있습니다. 상관관계는 여러 트리거 이벤트가 지정되고 시간 연산자로 연결될 때 발생합니다. 예를 들면 다음과 같습니다.

RULE multipleConditions
WHEN 
  EVENT OCCURS ON "/types/Customer/insert" AS Customer
  BEFORE
    EVENT OCCURS ON "/types/Order/insert" AS Order
    WITHIN 30 seconds 
    CONSTRAIN TO Order.value.customer == Customer.value.name

이 예에서 규칙 본문은 삽입이 있는 경우에만 평가됩니다. 빠른  삽입이 뒤따릅니다 주문번호 첫 번째 이벤트가 발생한 후 30초 이내에 두 번째 이벤트가 발생하고 두 이벤트 모두 동일한 고객 객체를 참조합니다.

상관관계가 있는 트리거 조건의 일반적인 형태는 다음과 같습니다.

<eventBinding> <temporalOperator> <triggeringCondition> WITHIN <windowInterval> [CONSTRAIN TO <queryCondition>]

위 예의 시간 연산자는 BEFORE, 는 한 사건이 다른 사건보다 먼저 발생함을 나타냅니다. 시간 연산자의 전체 집합은 다음과 같습니다.

  • BEFORE 왼쪽 이벤트는 오른쪽 이벤트보다 먼저 발생합니다.
  • AFTER 왼쪽 이벤트는 오른쪽 이벤트 이후에 발생합니다.
  • AND 왼쪽 및 오른쪽 이벤트는 어느 순서로든 발생합니다.

이내에

The WITHIN 절은 두 사건이 시간적으로 얼마나 가깝게 발생해야 하는지 지정합니다. 이 시간 간격은 일반적으로 다음과 같이 지정됩니다. 간격 리터럴.

예를 들어,

WITHIN 12 seconds

이는 두 번째 이벤트가 첫 번째 이벤트 발생 후 12초 이내에 도착해야 함을 명시합니다. 운영 체제와 기반 인프라에서 사용되는 스케줄링 알고리즘의 변동성으로 인해 12초 간격이 마이크로초 단위까지 정확하게 적용되지는 않습니다. 개발자는 이 간격을 최소 12초 이상, 그리고 규칙 평가 스케줄링 및 평가 완료와 관련된 지연 시간을 더한 값으로 생각하는 것이 더 적절합니다.

a에 지정된 간격이 WITHIN 절이 만료되면 규칙에서 조치를 취해야 할 수 있습니다. 이는 규칙 본문에 TIMEOUT 섹션을 지정하여 수행됩니다. WITHIN 간격이 만료되면 다음 문장이 포함됩니다. TIMEOUT 섹션이 실행됩니다. 참조 TIMEOUT 절 자세한 정의를 위해 TIMEOUT.

제한하다

The CONSTRAIN TO 절은 상관된 이벤트가 충족해야 하는 결합 조건을 지정합니다. 예:

RULE multipleConditions
WHEN 
  EVENT OCCURS ON "/types/Customer/insert" AS Customer
  BEFORE
    EVENT OCCURS ON "/types/Order/insert" AS Order
    WITHIN 30 seconds 
    CONSTRAIN TO Order.value.customer == Customer.value.name

고객 이름 빠른  이벤트는 고객과 일치해야 합니다. 주문번호 이벤트. 이벤트 쌍이 조건을 충족하지 못하면 규칙 본문은 평가되지 않습니다. 이 예에서 이러한 의미 체계는 다른 고객의 주문을 받은 특정 고객에 대한 이벤트를 처리하는 것은 의미가 없다는 직관적인 개념과 일치합니다.

The CONSTRAIN TO 절에는 상관 관계가 있는 두 이벤트의 값을 비교하는 임의로 복잡한 논리 표현식이 포함될 수 있습니다. 단일 이벤트를 제한하는 표현식을 포함할 수도 있지만, 이러한 표현식은 다음에서 더 적절하게 지정됩니다. 이벤트 바인딩 를 사용하여 WHERE 절. 이를 통해 시스템에 더 많은 최적화 대안을 제공합니다. 예를 들어 다음과 같습니다.

RULE multipleConditions
WHEN 
  EVENT OCCURS ON "/types/Customer/insert" AS Customer
  BEFORE
    EVENT OCCURS ON "/types/Order/insert" AS Order
    WITHIN 30 seconds
    CONSTRAIN TO Order.value.customer == Customer.value.name AND Customer.value.name == "paul"

유효하다 CONSTRAIN TO 절이지만 선호되는 표현은 다음과 같습니다.

RULE multipleConditions
WHEN
  EVENT OCCURS ON "/types/Customer/insert" AS Customer WHERE Customer.value.name == "paul"
  BEFORE 
    EVENT OCCURS ON "/types/Order/insert" AS Order
    WITHIN 30 seconds
    CONSTRAIN TO Order.value.customer == Customer.value.name

복합 상관 관계

시간적 이벤트를 구성하여 더 복잡한 조건을 표현할 수 있습니다. 조건은 산술 표현식 계산과 유사한 방식으로 왼쪽에서 오른쪽으로 평가됩니다. 예를 들면 다음과 같습니다.

RULE multipleConditions
WHEN
  EVENT OCCURS ON "/types/Customer/insert" AS Customer
  BEFORE
    EVENT OCCURS ON "/types/Order/insert" AS Order
    WITHIN 30 seconds 
    CONSTRAIN TO Order.value.customer == Customer.value.name
  BEFORE 
    EVENT OCCURS ON "/types/Shipment/insert" AS Shipment
    WITHIN 5 minutes 
    CONSTRAIN TO Order.value.orderNo == Shipment.value.orderNo

시스템은 첫 번째 조건을 평가한 후 두 번째 조건을 기다리고, 처음 두 조건이 충족되면 세 번째 조건을 기다립니다. 우선순위는 산술 표현식과 유사한 방식으로 괄호를 사용하여 수정할 수 있습니다.

RULE multipleConditions
WHEN 
  EVENT OCCURS ON "/types/Customer/insert" AS Customer
  BEFORE
    (
       EVENT OCCURS ON "/types/Order/insert" AS Order
       BEFORE 
         EVENT OCCURS ON "/types/Shipment/insert" AS Shipment
         WITHIN 5 minutes 
         CONSTRAIN TO Order.value.orderNo == Shipment.value.orderNo
    )
WITHIN 30 seconds 
CONSTRAIN TO Order.customer == Customer.name

이 수정된 예에서는 우선순위에 따라 첫 번째 조건이 평가된 후, 그 다음 두 조건의 평가 결과와 결합됩니다. CONSTRAIN TO   WITHIN 이전에 두 번째 조건 다음에 있던 절은 표현식의 끝으로 이동되었습니다. 두 번째와 세 번째 조건이 첫 번째 시간 연산자에 대해 단일 조건으로 평가되기 때문입니다. 또한 WITHIN 조항은 이제 다소 일관성이 없습니다. 두 번째 조건과 세 번째 조건 사이에는 5분의 대기 시간을 지정하지만 첫 번째 조건과 두 번째 및 세 번째 조건의 조합 사이에는 30초만 지정하기 때문입니다.

WHEN 조항 복합 트리거 조건은 여러 이벤트 스트림에서 수신되는 데이터를 상호 연관시키는 강력한 도구입니다. 이는 두 개 이상의 센서에서 데이터가 수신되는 소비자 및 산업 환경에서 흔히 사용됩니다. 예를 들어, 소매점에서는 BLE 비콘, 실내 위치 시스템, 그리고 소비자의 스마트폰에서 정보를 수신할 수 있습니다. 산업 환경에서는 센서 데이터가 서로 다른 채널의 여러 센서, 그리고 경우에 따라 측정값의 시간적 상관관계를 분석해야 하는 별도의 기계에서 수신됩니다.

이벤트 스트림 병합

때로는 동일한 데이터를 생성하는 여러 이벤트 스트림이 있을 수 있습니다. 예를 들어,   센서 데이터와 다양한 물리적 위치에서 데이터를 제공하는 여러 소스 인스턴스를 제공합니다. 이 경우 각 소스에 바인딩할 별도의 규칙을 작성하는 대신, 이벤트 스트림을 병합하여 단일 규칙으로 처리할 수 있습니다. 이는 다음을 사용하여 수행됩니다. OR WHEN 절에 연산자를 사용합니다. 예:

RULE processMergedStream
WHEN
  EVENT OCCURS ON "/sources/EasternSource"
  OR
  EVENT OCCURS ON "/sources/WesternSource/"

이 예에서는 EasternSource 또는 WesternSource로부터 메시지를 수신할 때마다 규칙 본문이 평가됩니다. 메시지는 도착하는 대로 처리되므로, 출처와 관계없이 서로 인터리빙됩니다.

병합 트리거 조건의 일반적인 형태는 다음과 같습니다.

<eventBinding> OR <targetCondition>

병합되는 이벤트 스트림에는 동일한 이벤트 스키마 유형이 있어야 합니다(참조). 소스   주제 이벤트 스키마 유형을 지정하는 방법에 대해서는). 또한 동일한 로컬 변수(기본값)에 바인딩되어야 합니다. event 또는 일반적인 별칭).

누락된 이벤트 감지

이벤트가 발생하는 대로 이벤트를 처리하는 것 외에도, 이벤트가 예상대로 발생하지 않을 때 규칙에서 코드를 실행해야 하는 경우가 있을 수 있습니다. 이내에 절은 이것을 다음의 맥락에서 달성합니다. 상관 관계하지만 단일 이벤트 소스에서 이벤트가 발생하지 않는 것을 감지하는 것은 어떨까요? 이를 위해 EXPECT 절을 사용합니다. 이 절의 구문은 다음과 같습니다.

<eventBinding> [EXPECT <expectation> <interval>]

어디에 expectation 이벤트가 "누락"되었는지 확인하는 방법을 설명합니다. interval 기대가 충족될 때까지 기다려야 하는 시간을 지정합니다(일반적으로 간격 리터럴). 가능한 예상 사항은 다음과 같습니다.

  • EVERY – 우리는 각 기간 동안 적어도 하나의 이벤트를 볼 것으로 예상합니다. interval. 주어진 어떤 interval 이벤트가 발생하지 않으면 시스템에서 시간 초과가 발생합니다.
  • WITHIN – 주어진 이벤트가 발생한 후 지정된 시간 내에 또 다른 이벤트가 발생할 것으로 예상합니다. interval. 다음 이벤트가 보이지 않을 때마다 interval 시간이 지나면 시스템에서 시간 초과가 발생합니다.

지정된 기대 조건이 충족되지 않을 때마다 규칙은 조치를 취해야 할 수 있습니다. 이는 규칙 본문에 TIMEOUT 섹션을 지정하여 수행됩니다. 기대 조건으로 인해 시간 초과가 발생할 때마다 TIMEOUT 섹션에 포함된 명령문이 실행됩니다. 자세한 내용은 다음을 참조하십시오. TIMEOUT 절 자세한 정의를 위해 TIMEOUT.

예를 들어, 다음과 같은 것이 있다고 가정해 보겠습니다. MQTT 소스 메시지를 지속적으로 생성해야 합니다. 1분 이상 메시지 생성이 중단되는 시점을 알고 싶다면 다음을 사용할 수 있습니다.

WHEN EVENT OCCURS ON "/sources/myMQTTSource" EXPECT EVERY 1 minute
... do work on message ...
TIMEOUT
... do work for lack of data ...

이 예에서 소스가 메시지 전송을 중단하면 규칙의 TIMEOUT 섹션을 1분마다 한 번씩 호출합니다. 1분이 지난 후 한 번만 호출되도록 하려면 다음을 사용할 수 있습니다. EXPECT WITHIN.

TIMEOUT 절

The TIMEOUT 절은 규칙의 지정된 상관 이벤트가 실행될 경우 실행될 규칙 본문의 대체 변형을 선언합니다. WHEN 절 지정된 기간 내에 발생하지 않습니다. 예:

RULE multipleConditions
WHEN
  EVENT OCCURS ON "/types/Customer/insert" AS Customer WHERE Customer.value.name == "paul"
  BEFORE
    EVENT OCCURS ON "/types/Order/insert" AS Order
    WITHIN 30 seconds 
    CONSTRAIN TO Order.value.customer == Customer.value.name

    INSERT INTO Log(msg: "The event occurred.")

TIMEOUT

    INSERT INTO Log(msg: "The event did not occur.")

상관 이벤트가 지정된 30초 시간 간격 내에 발생하면 규칙의 본문이 실행됩니다(이 경우 첫 번째 INSERT 성명서). 그러나 이벤트가 발생하지 않으면 이벤트 뒤에 지정된 본문은 TIMEOUT 키워드가 실행됩니다(이 경우 두 번째 INSERT 성명서).

규칙 전

규칙이 사용되기 전에 기본 유효성 검사 확장 을 위해 제공되었다 리소스 유형. 다음과 같은 구문을 사용합니다.

RULE <name>
BEFORE (INSERT | UPDATE | DELETE) ON <resourceType> 
[VAIL Statement]*

작동 중인 리소스 인스턴스는 암묵적으로 정의된 것에 바인딩됩니다. 변수 타겟과 같은 이름을 가진 리소스 유형. 그만큼 VAIL 진술서 연관된 작업 직전에 동기적으로 평가됩니다. 규칙에 의해 생성된 값은 작업이 최종적으로 적용될 때 실제 리소스 인스턴스로 사용됩니다. 이를 통해 규칙은 인스턴스를 변경하여 속성을 추가, 제거 또는 변경할 수 있습니다. 또한 규칙은 다음을 반환하여 작업을 취소할 수 있습니다. null 값. 이는 대상 유형을 나타내는 변수를 설정하여 수행할 수 있습니다. null 규칙 실행이 끝날 때 또는 명시적으로 사용 RETURN null 성명서.

서비스

서비스 애플리케이션의 특정 기능적 측면과 관련된 동작을 캡슐화합니다. 서비스는 해당 동작을 인터페이스를 통해 노출하는데, 이 인터페이스는 서비스 소비자가 사용할 수 있는 프로시저 및/또는 이벤트 유형 목록으로 구성됩니다.

안내

절차는 동작을 구현하는 데 사용됩니다. 절차 서명 에 정의 서비스 인터페이스 (일명 서비스 절차) 및 VAIL 코드를 모듈화하여 EDA를 지원하는 기능을 재사용하고 구성하는 것을 더 쉽게 만듭니다(일명 유틸리티 절차). 프로시저 호출 프로시저 이름과 매개변수 목록(위치별) 또는 명명된 매개변수 세트를 제공해야 합니다.

서비스 절차

서비스 절차 선언은 선택 사항으로 구성됩니다. 가시성 수정자, 선택 사항 상태 접근 수정자은 정규화된 프로시저 이름 서비스 이름과 프로시저 이름을 결합한 것 형식 매개변수, 선택 사항 리턴 타입, 선택 사항 WITH 절 그리고의 목록 VAIL 진술서 프로시저의 본문을 나타냅니다. 공식 구문은 다음과 같습니다.

[PRIVATE] [GLOBAL | MULTI PARTITION | STATELESS] PROCEDURE <serviceName>.<name>(<parameters>)[:<returnType>]
[WITH properties = <procedureProperties>,
      profiles = ["<localProfile>", "<systemProfile>"], 
      ars_dependentResource = "/<resource>/<resourceId>", 
      ars_public = [true|false],
      ars_group = "<groupName>"
]
<VAIL Statements>*

프로시저 선언문의 맨 위에 있는 모든 주석은 다음과 같습니다. 설명 절차에 대한 설명입니다. 이 설명은 절차 또는 해당 서비스의 모든 사용에 전달됩니다. 프롬프트 활동 패턴 제출LLM.submitPrompt 프로시저 or 도구 GenAI 구성 요소. 최상위 주석/설명은 모든 주석/설명보다 먼저 나와야 합니다. 패키지 선언 절차가 있다면, 해당 절차에 따라.

예 :

// changes the salary for the employee with name "empName"
PROCEDURE Payroll.changeSalary(empName String, newSalary Decimal): Employee

UPDATE Employee (salary: newSalary) WHERE name == empName

이 절차는 다음의 일부입니다. 급여 서비스입니다. 이 함수는 직원 이름과 해당 직원의 새 급여, 두 개의 매개변수를 받습니다. 최상위 주석이 해당 함수의 설명이 됩니다. 호출되면 직원을 업데이트하여 새 급여를 해당 직원에게 할당하고 업데이트된 직원 인스턴스를 반환합니다. 물론, 직원이 존재하지 않거나 직원 직책의 표준 급여 범위를 벗어나는 급여가 지정된 경우와 같은 예외적인 상황을 처리하는 것이 더 현실적인 예가 될 것입니다.

절차 수정자

서비스 프로시저에는 선택적 가시성 수정자 및/또는 선택적 상태 액세스 수정자(서비스가 상태 저장형인 경우)가 있을 수 있습니다.

가시성 수정자

  • PRIVATE – 해당 프로시저가 동일한 서비스의 다른 프로시저 또는 서비스 이벤트 핸들러. 서비스 인터페이스의 일부로 만들지 않고도 내부 서비스 동작을 모듈화하는 데 유용합니다. 개인 프로시저는 원격으로 호출할 수 없습니다. 충돌하는 상태 접근 제한자(예: 상태 없는 프로시저에서 분할된 프로시저)를 사용하여 상태 있는 개인 프로시저를 호출하는 것은 허용되지만, 다음을 사용해야 합니다. 실행 성명서.

상태 액세스 수정자

서비스 프로시저는 해당 서비스에 정의된 모든 상태에 접근할 수 있습니다. 다음과 같은 네 가지 상태 접근 패턴이 있습니다.

  • 글로벌 - 글로벌 프로시저는 서비스에 액세스할 수 있습니다. 세계 국가.
  • 단일 파티션 - 단일 파티션 프로시저는 서비스에 액세스할 수 있습니다. 분할된 상태. 프로시저를 호출할 때 액세스해야 하는 파티션을 식별하는 데 사용되는 최소한 하나의 매개변수가 필요합니다.
  • 다중 파티션 - 다중 파티션 프로시저는 서비스에 액세스할 수 있습니다. 분할된 상태호출되면 존재하는 각 파티션에 대해 한 번씩 실행됩니다(이러한 호출은 동시에 발생할 수 있음).
  • 상태 비저장 – 상태 비저장 프로시저는 상태 저장 서비스의 상태 속성에 접근하지 않는 프로시저입니다. 분할된 서비스의 일부로 정의된 상태 비저장 프로시저에는 partitionKey 매개변수가 필요하지 않습니다.

이러한 액세스 패턴에 대한 자세한 내용은 다음에서 확인할 수 있습니다. 상태 저장 서비스   메모리 내 상태 관리.

서비스가 전역 상태만 선언하면 해당 서비스의 모든 프로시저는 "전역" 상태가 됩니다. 분할 상태만 선언하면 모든 프로시저는 "단일 파티션" 상태가 됩니다. 서비스가 전역 상태와 분할 상태를 모두 선언하면, 수정자가 없는 프로시저는 기본적으로 "단일 파티션" 상태가 됩니다. 프로시저에 다음 상태 액세스 수정자를 적용하여 기본 동작을 변경할 수 있습니다.

  • GLOBAL – 이 프로시저는 전역 상태 액세스 패턴을 사용하며 서비스의 전역 상태에 액세스할 수 있습니다. 이 수정자는 서비스가 전역 상태를 선언하는 경우에만 유효합니다.
  • MULTI PARTITION – 이 프로시저는 다중 파티션 상태 액세스 패턴을 사용하며 서비스의 분할된 상태에 액세스할 수 있습니다. 이 수정자는 서비스가 분할된 상태를 선언한 경우에만 유효합니다.
  • STATELESS – 해당 프로시저는 상태 비저장이므로 서비스의 상태(전역 또는 분할)에 액세스할 수 없습니다.

없다. SINGLE PARTITION 수정자는 존재한다면 항상 선택 사항이 될 것이기 때문에(기본 동작을 고려하면) 선택 사항입니다.

정식 이름

서비스 프로시저 선언에는 서비스 이름과 간단한 프로시저 이름으로 구성된 정규화된 프로시저 이름이 포함되며, 이는 마침표( )로 구분됩니다..). VAIL 코드에서 서비스 프로시저를 참조할 때는 정규화된 이름을 사용해야 합니다. 두 이름 모두 유효한 Java 식별자여야 하며, 이는 다음을 의미합니다.

  • 영숫자 및 밑줄 문자로 구성될 수 있습니다.
  • 숫자로 시작할 수 없습니다

또한, "ars_"로 시작하는 모든 이름은 시스템에서 사용하도록 예약되어 있습니다.

서비스 프로시저를 선언하면 프로시저와 해당 프로시저를 포함하는 서비스가 모두 생성됩니다(아직 존재하지 않는 경우). 이러한 방식으로 생성된 서비스는 항상 상태가 없습니다. 다음을 참조하세요. 서비스 문서 신고 방법 상태 저장 서비스.

이전 예를 떠올려보면 다음과 같습니다.

PROCEDURE Payroll.changeSalary(empName String, newSalary Decimal): Employee

UPDATE Employee (salary: newSalary) WHERE name == empName

이는 명명된 프로시저를 선언합니다. 급여 변경 이는 서비스의 일부입니다 급여이 프로시저를 호출하려면 다음과 같이 VAIL 코드를 작성합니다.

var employee = <... create or select employee instance ...>
var updatedEmployee = Payroll.changeSalary(employee.name, 50000)

형식 매개변수

프로시저의 형식 매개변수는 쉼표로 구분된 0개 이상의 매개변수 선언 목록으로 구성됩니다. 각 매개변수 선언은 매개변수의 이름과 유형, 그리고 0개 이상의 매개변수 수정자로 구성됩니다. 형식 구문은 다음과 같습니다.

parameterList := [<parameterDecl>](, <parameterDecl)*

parameterDecl := <parameterName> [<parameterType>] <parameterModifier>*

parameterModifier := ARRAY | REQUIRED | DEFAULT <defaultValue> | DESCRIPTION <stringConstant>

매개변수 이름은 합법적이어야 합니다. VAIL 식별자 그리고 매개변수 유형은 합법적이어야 합니다. VAIL 유형. 절차가 다음과 같은 경우 단일 파티션 절차 그러면 최소한 하나의 매개변수가 있어야 합니다. 유형 다음 중 하나여야 합니다. StringIntegerDecimalCurrencyDateTime및 ResourceReference.

예 :

PROCEDURE Payroll.changeSalary(empName String REQUIRED, newSalary Decimal(2) REQUIRED): Employee

UPDATE Employee (salary: newSalary) WHERE name == empName

이 절차에는 2개의 매개변수가 있습니다. 직원 이름 이는 반드시 ~이어야 합니다 String   새로운 급여 이는 반드시 ~이어야 합니다 Decimal "정밀도"가 2인 경우 두 매개변수 모두 다음과 같이 선언됩니다. REQUIRED (조금 더 자세히).

매개 변수 유형

선택 사항이기는 하지만 모든 매개변수에 대해 유형을 선언하는 것이 좋습니다(유형이 지정된 매개변수와 유형이 지정되지 않은 매개변수를 혼합하는 것은 허용되지 않음). 유형이 지정되면 시스템은 매개변수에 제공된 모든 값이 선언된 유형의 유효한 값인지 확인하고 지원되는 모든 작업을 자동으로 수행합니다. 유형 변환VAIL은 동적으로 타입이 지정되므로 이러한 유효성 검사/변환은 런타임에 수행됩니다. 또한 Vantiq 시스템은 요청된 작업이 수행 가능한지 확인하고, 수행 불가능한 경우 오류를 생성합니다("덕 타이핑"이라고도 함). 이 검사는 매개변수에 선언된 타입이 있는지 여부와 관계없이 수행됩니다.

매개변수 수정자

매개변수에는 다음 수정자가 있을 수 있습니다.

  • ARRAY – 전달되는 값이 선언된 유형의 배열이어야 함을 선언합니다(선언된 유형이 있는 경우) 또는 선언된 유형이 없는 경우 아무 배열이나 선언합니다. 시퀀스 현재 프로시저 매개변수로 지원되지 않습니다.
  • REQUIRED – 매개변수가 필수적이며 모든 호출자가 값을 제공해야 한다는 것을 선언합니다(해당 값은 다음과 같이 지정할 수 있음) null).
  • DEFAULT – 매개변수에 대한 값이 제공되지 않으면 지정된 값을 사용해야 함을 선언합니다.
  • DESCRIPTION – 문서화 목적으로 사용되는 매개변수에 대한 설명을 제공합니다.

다음은 를 사용하는 예입니다. ARRAY 수정 자 :

PROCEDURE Payroll.changeSalary(empName String ARRAY, newSalary Real ARRAY)

FOR (i in range (0, empName.size(), 1)) { 
    UPDATE Employee (salary: newSalary[i]) WHERE name == empName[i]
}

이 프로시저는 이름과 급여 배열을 받아서 두 배열의 모든 직원을 업데이트합니다. 이 예제에서는 두 배열의 크기가 같다고 가정합니다. newSalary 배열이 empName 배열보다 짧으면 런타임 오류가 발생합니다.

매개변수 전달

서비스 인터페이스의 일부인 프로시저(비공개 프로시저라고도 함)는 다음을 구현합니다. 가치로 부르다 객체와 배열이 값으로 처리되는 의미론입니다. 즉, 매개변수 값이 배열이나 객체인 경우, 해당 배열이나 객체의 복사본이 생성되어 매개변수의 실제 값으로 전달됩니다. 즉, 프로시저 내에서 배열이나 객체에 적용된 변경 사항은 업데이트된 값이 프로시저 반환 값의 일부로 호출자에게 명시적으로 반환되지 않는 한 호출자에게 표시되지 않습니다. 이러한 의미론 덕분에 원격 프로시저 호출이 로컬 프로시저 호출과 동일하게 동작하여 투명한 분산 처리가 가능합니다.

개인 절차 구현 객체 참조로 호출 의미론, 객체와 배열 참조 값으로 처리됩니다. 즉, 매개변수 값이 배열이나 객체인 경우 매개변수는 참조에 바인딩됩니다. 즉, 프로시저는 배열이나 객체의 내용을 변경할 수 있지만, 어느 배열이나 객체가 참조되고 있습니다. 원격 호출이 불가능하기 때문에 이러한 의미 체계가 더 효율적이며 사용됩니다.

프라이빗 프로시저에 사용되는 의미 체계는 Java에서 사용하는 의미 체계와 동일합니다. 이는 값에 의한 호출(Call by Value)이라고도 합니다. 이 둘의 차이점은 무엇이 값으로 간주되는지입니다(미묘하지만 중요합니다).

반환 유형

프로시저는 완료 시 결과를 생성합니다. 기본적으로 이 결과는 마지막으로 실행된 명령문의 값입니다. 이 기본 동작은 다음을 사용하여 변경할 수 있습니다. RETURN 문(프로시저의 마지막 문이어야 함). 프로시저는 선택적으로 반환 유형을 선언할 수 있습니다. 반환 유형이 제공된 경우 시스템은 해당 유형을 사용하여 유효성을 검사하고, 유효한 경우 변하게 하다 절차에 의해 생성된 모든 값.

이전 예를 떠올려 보세요.

PROCEDURE Payroll.changeSalary(empName String REQUIRED, newSalary Decimal(2) REQUIRED): Employee

UPDATE Employee (salary: newSalary) WHERE name == empName

이 절차는 결과를 반환합니다. UPDATE 진술과 반환이 선언된 유형에 대해 검증될 것입니다. Employee.

반환 유형은 다음 두 가지를 모두 사용하여 한정될 수 있습니다. Array   Sequence 키워드. 프로시저가 시퀀스를 반환한다고 명시적으로 선언하면 시스템은 프로시저의 결과가 생성되는 대로 "스트리밍"할 수 있습니다. 이는 다음 중 하나의 경우에 발생합니다.

  • VAIL 호출자는 다음을 사용합니다. 실행 처리 블록이 있는 문장입니다.
  • VAIL 호출자는 다음을 사용합니다. 되풀이 시퀀스를 처리하는 명령문입니다.
  • The stream URL 매개변수는 사용 시 설정됩니다. REST 바인딩.

다음은 시퀀스를 반환하는 프로시저의 예입니다.

PROCEDURE employeesWithMinSalary(minSalary Real): Object Sequence

SELECT SEQUENCE FROM Employee WHERE salary >= minSalary

이 프로시저는 주어진 최소 급여를 받는 모든 직원이 포함된 시퀀스를 반환합니다.

WITH 절

절차 WITH 절을 사용하면 VAIL 구문을 통해 프로시저를 구성할 수 있습니다. WITH 절은 다음 속성을 지원합니다.

  • properties – 에 해당합니다 ars_properties 기본 프로시저 정의에 대한 값입니다. 속성을 사용하여 동적 프로시저를 선택할 수 있습니다. EXECUTE 성명서.
  • profiles – 프로시저에서 수행하는 작업을 승인하기 위해 실행 시 호출자의 프로필을 재정의하는 프로필 배열입니다. 프로시저 생성자는 지정된 프로필을 부여하는 데 필요한 권한을 가지고 있어야 합니다.
  • ars_public – 인증 없이 모든 사용자가 프로시저를 사용할 수 있는지 여부를 나타내는 데 사용됩니다. 지정하지 않으면 ars_public 기본값은 false입니다.
  • ars_dependentResource – 프로시저와 다른 리소스 인스턴스 간의 종속성을 지정합니다. 리소스 참조이 옵션을 지정하면 종속 리소스가 삭제되면 프로시저도 삭제됩니다.
  • ars_group – 프로시저가 속한 보안 그룹을 나타냅니다. 그룹 값을 지정하면 해당 그룹의 멤버만 프로시저에 액세스할 수 있습니다. 네임스페이스 관리자는 항상 프로시저에 액세스할 수 있습니다.
  • ars_relationships – 다음을 지정합니다. 명백한 규칙이나 절차가 네임스페이스의 다른 리소스와 맺고 있는 관계입니다.

공공 절차

다음이 있는 절차 ars_public 옵션이 true로 설정됨 WITH 조항은 권한 확인 없이 누구나 실행할 수 있습니다. 공개 프로시저는 공개적으로 접근 가능한 기능을 구현하는 데에만 사용해야 하며, 가장 일반적으로는 서버 측 기능을 지원하는 데 사용됩니다. 공개 클라이언트.

모든 공공 절차는 다음을 활용해야 합니다. profiles 런타임에 적용되는 실행 프로필을 지정하는 속성입니다. profiles 지정되지 않으면 알 수 없는 사용자가 공개 프로시저를 호출할 때 어떤 수준의 권한으로 실행해야 하는지 판단할 수 없습니다.

공개적으로 실행되는 절차는 익명으로 실행됩니다. publicExecutor ID는 모든 감사 레코드에 나타날 사용자 이름입니다. ars_createdBy or ars_modifiedBy 해당 프로시저 실행 중에 생성된 모든 레코드의 값입니다.

프로시저를 공개적으로 접근 가능하도록 표시한다고 해서 반드시 공개적으로 실행되어야 하는 것은 아닙니다. 인증되고 권한이 부여된 사용자에 의해 실행될 수 있으며, 이 경우 프로시저는 해당 ID가 아닌 해당 ID로 실행됩니다. publicExecutor 정체.

REST API를 통해 공개 프로시저를 호출하는 방법에 대한 자세한 내용은 다음을 참조하세요. API 참조 가이드.

그룹 제한 절차

기본적으로 네임스페이스의 모든 프로시저는 네임스페이스의 모든 사용자가 실행할 수 있습니다. 프로시저에 대한 액세스를 제한하려면 다음을 설정합니다. ars_group 절차의 가치 WITH 어떤 조항에 대한 그룹. 일단 설정되면 해당 프로시저는 그룹 구성원과 네임스페이스 관리자(일반적으로 그룹 제한을 우회하는 사람)에게만 표시되고 실행 가능합니다.

일단 설정하면 ars_group 프로시저의 값은 변경할 수 없습니다. 그룹을 변경해야 하는 경우 프로시저를 삭제하고 새 그룹 사양으로 프로시저를 다시 만드세요.

유틸리티 절차

유틸리티 프로시저 선언은 이름, 형식 매개변수, 선택 사항 리턴 타입, 선택 사항 WITH 절 그리고의 목록 VAIL 진술서 프로시저의 본문을 나타냅니다. 선언 구문은 다음과 같습니다.

<name>(<parameters>)[:<returnType>]
[WITH properties = <procedureProperties>,
      profiles = ["<localProfile>", "<systemProfile>"], 
      ars_dependentResource = "/<resource>/<resourceId>", 
      ars_public = [true|false],
      ars_group = "<groupName>"
      ars_relationships = [{"to": "/<resource>/<resourceId>", "type": <relationship type>}...]
]
<VAIL Statements>*

프로시저 이름은 영숫자와 밑줄로 구성된 유효한 Java 식별자여야 합니다. 숫자로 시작할 수 없습니다. 사용 가능한 모든 옵션은 서비스 프로시저와 동일하게 작동합니다.

시스템 절차 숨기기

반드시 권장되는 것은 아니지만, 시스템 네임스페이스에 정의된 것과 동일한 이름을 가진 서비스 및 유틸리티 프로시저를 모두 정의할 수 있습니다(특정 "내장" 프로시저는 제외). 이 경우 로컬에서 정의된 프로시저는 동일한 이름의 시스템 프로시저를 사실상 "숨깁니다". 프로시저를 참조하면 시스템 버전이 아닌 로컬 버전이 호출됩니다. 다음을 사용하여 이름을 추가로 한정하면 프로시저의 시스템 버전을 사용할 수 있습니다. system. 접두사. 예를 들어, 다음은 이전에 정의한 "changeSalary" 프로시저의 시스템 버전을 참조합니다(이러한 프로시저가 존재한다고 가정).

system.Payroll.changeSalary()

데이터 모델 선언

애플리케이션 데이터 모델을 구성하는 리소스는 플랫폼의 리소스 API를 사용하여 생성됩니다. 리소스 참조 가이드 자세한 내용은 다음을 참조하세요. 생성된 리소스는 지정된 네임스페이스 내에서 전역적으로 표시되며 VAIL을 사용하여 선언된 리소스에서 참조할 수 있습니다. 이러한 리소스는 애플리케이션이 기능을 제공하기 위해 관리할 상태를 정의합니다.

이 상태는 애플리케이션이 반응할 이벤트와 애플리케이션이 (이벤트에 대한 응답의 일부로) 처리할 모든 수동 데이터를 모두 포함합니다. 데이터 모델은 세 가지 고유한 도메인으로 구성됩니다. 메모리 내 데이터영구 데이터글렌데일 외부 시스템의 데이터.

메모리 내 상태

애플리케이션의 메모리 내 상태는 다음과 같이 정의됩니다. 주제 이벤트를 보내고 받을 수 있는 채널을 선언합니다. 상태 저장 서비스 수동적인 메모리 내 상태를 관리하고 해당 상태를 조작할 수 있는 API를 제공합니다.

이상의 주제

토픽은 Vantiq 플랫폼 내부에 정의된 애플리케이션 이벤트를 송수신하는 방법을 제공합니다. 이러한 이벤트는 단일 애플리케이션에만 적용되거나 여러 애플리케이션에 걸쳐 적용될 수 있습니다. 이벤트 카탈로그각 주제는 다음을 사용하여 이벤트에서 전달되는 데이터의 구조를 선언합니다. 유형. 애플리케이션은 다음을 통해 이러한 이벤트를 수신합니다. 규칙 과 이벤트 바인딩 형태 :

WHEN EVENT OCCURS ON "/topics/<topicName>"

주제 이름 자체는 다음과 같은 "경로" 형식을 취합니다. /engineSensor/rpm/max.

애플리케이션은 VAIL을 사용하여 주제를 통해 이벤트를 보냅니다. PUBLISH 성명서.

인메모리 상태 관리

상태 저장 서비스 구조가 정의된 메모리 내 상태에 대한 액세스를 캡슐화합니다. 유형상태 접근은 서비스 인터페이스를 구성하는 프로시저를 통해 제공되므로, 각 서비스는 관리되는 상태에 적합한 API를 제공할 수 있습니다. 메모리 내 상태 관리의 핵심 측면은 서비스의 여러 "클라이언트"(규칙이든 다른 서비스든)가 동시에 서비스를 호출할 때 발생할 수 있는 동시 접근 요청을 처리하는 것입니다. 이는 VAIL 내장 함수를 사용하여 수행됩니다. 동시 서비스   함수 표현식예를 들어, 제공된 평균을 계산하는 절차는 다음과 같습니다. Real 동시 액세스를 처리하는 방식으로 값을 지정합니다.

PROCEDURE ComputeSensorStats.recordStatsForSensor(sensorId String, sensorValue Real)
// The property "statsBySensorId" is defined in the service's partitioned type.
// It is typed as "Map" and implicitly initialized to "Concurrent.Map()"
statsBySensorId.compute(sensorId, (key, stats) => {
    // If this is the first time we've seen this sensor id, set up the defaults
    if (stats == null) {
        stats = {        
            total: 0.0, 
            count: 0
        }
    }

    # Compute the average based on the supplied value    
    stats.total += sensorValue
    stats.count += 1
    stats.avg = stats.total / stats.count
    return stats
})

위의 예는 메모리 내 상태를 업데이트하도록 설계된 프로시저를 보여주지만 물론 서비스도 해당 상태에 대한 액세스를 제공할 수 있습니다. 예를 들어:

PROCEDURE ComputeSensorStats.getSensorStats(sensorId String):Object
return statsBySensorId.get(sensorId)

지속 상태

응용 프로그램의 지속 상태는 다음과 같이 정의됩니다. 리소스 유형 여기에는 Vantiq 또는 애플리케이션별 유형에서 미리 정의된 유형이 포함될 수 있습니다. 정의된 후에는 이벤트를 생성하고 표준 집합을 지원하는 리소스 인스턴스를 관리하는 데 사용할 수 있습니다. 데이터 조작 이러한 작업은 대부분의 개발자에게 친숙한 SQL 유사 구문을 사용합니다.

데이터 검증 확장

이 기능은 모든 경우에 비활성화됩니다. 리소스 유형 가치가있는 true 을 통한 규칙억제됨

각 리소스 유형은 지원하는 속성을 선언합니다. 이러한 선언에는 시스템이 제출된 리소스 인스턴스의 구조와 내용을 검증하는 데 사용하는 정보가 포함됩니다. 예를 들어, 종업원 유형은 직원의 이름, 성, 중간 이름을 볼 것으로 예상한다고 선언할 수 있습니다. String 값과 성과 이름은 필수이지만 중간 이름은 선택 사항입니다. 이 경우 시스템은 삽입 또는 업데이트 시도를 거부합니다. 종업원 이러한 요구 사항을 충족하지 못하는 사례입니다.

그러나 때로는 더 복잡하거나 도메인별 유효성 검사를 정의해야 할 수도 있습니다. 이는 다음을 사용하여 수행할 수 있습니다. 규칙 전규칙은 연관된 작업에 직접 바인딩되어 작업의 결과에 영향을 미칠 수 있습니다(작업이 완전히 취소되는 것을 포함).

유형 이벤트 생성

이 기능은 모든 경우에 비활성화됩니다. 리소스 유형 가치가있는 true 을 통한 규칙억제됨

영구 리소스 인스턴스는 상태 변화를 나타내는 이벤트를 생성합니다. 이러한 이벤트에 대한 이벤트 경로의 일반적인 형식은 다음과 같습니다. /types/<resourceTypeName>/<operation>. 이러한 이벤트가 다음과 관련되어 있기 때문에 유형 리소스의 경우, 이러한 이벤트를 종종 "유형 이벤트"라고 합니다. 이벤트 경로에는 변경된 인스턴스와 연관된 리소스 유형의 이름과 변경을 유발한 작업이 포함됩니다. 가능한 작업은 다음과 같습니다.

  • insert – 리소스 인스턴스가 생성되었음을 나타냅니다.
  • 업데이트 - 리소스의 하나 이상의 인스턴스가 업데이트되었음을 ​​나타냅니다.
  • 삭제 – 리소스의 하나 이상의 인스턴스가 삭제되었음을 나타냅니다.

각 경우 이벤트 데이터는 실제 변경 사항에 대한 더 자세한 정보를 담고 있습니다. 단일 인스턴스가 변경되는 경우, 이벤트에는 영향을 받는 인스턴스의 사본이 포함됩니다. 최신 정보   삭제 작업에는 영향을 받는 인스턴스를 조작할 필요 없이 성능을 향상시키도록 설계된 "대량" 버전이 있습니다. 이러한 경우 이벤트에는 다음과 같은 작업 메타데이터가 포함됩니다.

  • ars_bulkOperation – 설정될 부울 속성 true
  • count – 영향을 받은 인스턴스의 개수
  • qual – 영향을 받는 인스턴스를 선택하는 데 사용되는 쿼리

The ars_bulkOperation 속성은 ~에 사용될 수 있습니다 WHERE 절의 이벤트 바인딩 대량 작업과 관련된 이벤트를 규칙이 수신하는지 여부를 확인합니다.

지속적인 상태 관리

메모리 내 상태와 마찬가지로, 영구 상태를 관리할 때 가장 중요한 고려 사항 중 하나는 동시 작업을 제대로 처리하는 것입니다. Vantiq 영구 데이터 모델은 각 개별 작업이 원자적으로 처리되도록 보장하지만, 트랜잭션을 지원하지 않으므로 이러한 보장을 일련의 작업이나 동시에 수행되는 작업으로 확장할 수 없습니다. 이로 인해 매우 흔한 "경합 상태"가 발생할 수 있습니다.

동시 업데이트

이러한 상황 중 하나는 애플리케이션이 리소스 인스턴스를 동시에 업데이트하려고 할 때 발생합니다. 예를 들어, 다음과 같은 VAIL 문이 있다고 가정해 보겠습니다.

// The variable "orderId" is assumed to be populated with the id of the target order instance
var order = SELECT * FROM Orders WHERE orderId == orderId
UPDATE Orders(total: order.total + 10) WHERE orderId == orderId

이 코드를 두 번 동시에 실행하면 최종 결과는 합계가 10 또는 20만큼 증가할 수 있습니다. 이 문제를 해결하기 위해 Vantiq 플랫폼은 낙관적 동시성 제어(OCC)라는 기술을 지원합니다.

OCC의 기본 아이디어는 대부분의 경우 업데이트가 성공할 것이라는 가정 하에 진행하는 것입니다. 대부분의 경우 실제 동시성이 없기 때문입니다. 만약 이것이 틀렸다고 판명되면, 시스템은 잘 알려진 예외 따라서 애플리케이션은 필요에 따라 조정하고 작업을 다시 시도할 수 있습니다. 이 예외에 대한 오류 코드는 항상 다음과 같습니다. io.vantiq.update.authorization.or.version.conflict.

이 기능이 작동하려면 시스템에 업데이트가 "오래된" 리소스 인스턴스에 적용되는지 여부를 확인할 수 있는 방법이 있어야 합니다. Vantiq는 다음을 사용하여 이를 수행합니다. ars_버전 시스템 속성입니다. 이 속성은 Vantiq 플랫폼에서 자동으로 유지 관리되며 리소스 인스턴스가 업데이트될 때마다 증가합니다. 이 속성을 모든 UPDATE 조작 애플리케이션은 Vantiq에 OCC를 사용하여 업데이트의 유효성을 확인하도록 지시합니다. 또 다른 요구 사항은 다음과 같습니다. WHERE 조항 UPDATE 정확히 하나의 인스턴스를 참조해야 합니다. 즉, 시스템의 내장 인스턴스를 사용해야 합니다. _신분증 속성 또는 리소스 유형 자연 키.

예 :

var updateComplete = false
for (i in range(0, 5) until updateComplete) {
    try {
        // The variable "orderId" is assumed to be populated with the id of the target order instance
        var order = SELECT * FROM Orders WHERE orderId == orderId
        UPDATE Orders(total: order.total + 10, ars_version: order.ars_version) WHERE orderId == orderId

        // If we get here the update succeeded, so we want to terminate the loop
        updateComplete = true
    } catch (error) {
        // If this isn't a version conflict, report it
        if (error.code != "io.vantiq.update.authorization.or.version.conflict") {
            rethrow(error)
        }

        // Since this is a version conflict, just fall through so we retry
    }
}

// Check to see if we completed the update successfully
if (!updateComplete) {
    // This is an error condition, so report it somehow...
}

여기에 우리는 다음을 포함했습니다. ars_버전 속성이므로 동시 업데이트를 시도하면 결과가 정확하거나 명시적인 오류가 발생합니다. TRY 성명서 오류를 가로채서 버전 충돌인지 확인할 수 있도록 하고, 그렇다면 중단하고 다음을 수행합니다. FOR 성명서 다시 한 번 시도해 보세요(이 예에서는 최대 5번까지).

동시 삽입

또 다른 형태의 경쟁 조건은 "동일한" 리소스 인스턴스(자연 키로 결정됨)를 두 번 이상 삽입하려고 시도하는 것입니다. 이 경우, 오류 코드와 함께 예외가 발생합니다. io.vantiq.resource.duplicate.key. 이 상황은 다음을 사용하여 피할 수 없습니다. SELECT 성명서 동시 실행이 있는 경우 두 실행 모두 인스턴스가 "누락"된 것으로 인식되어 삽입을 시도할 수 있으므로 먼저 기존 인스턴스를 확인해야 합니다. 이러한 시나리오를 해결하기 위해 VAIL은 다음을 제공합니다. UPSERT 성명서UPSERT 인스턴스가 존재하지 않으면 삽입하고, 인스턴스가 있으면 업데이트합니다. 필요한 재시도는 자동으로 처리합니다.

외부 상태

애플리케이션의 외부 상태는 다음과 같이 정의됩니다. 소스 지정된 프로토콜을 사용하여 Vantiq 플랫폼에서 외부 시스템으로의 연결을 선언합니다. 지원되는 구현의 전체 목록은 다음에서 확인할 수 있습니다. 외부 소스 참조 가이드. 선언된 소스는 이벤트를 보내고 받고 외부 시스템의 상태를 쿼리하는 데 사용할 수 있습니다(모든 소스 구현에서 이러한 기능을 사용할 수 있는 것은 아닙니다).

관심 있는 데이터가 제공되면 소스에서 이벤트가 생성될 수 있습니다. 이벤트 경로의 형식은 다음과 같습니다. /sources/<sourceName>소스는 다음을 사용하여 이벤트에 포함된 데이터의 구조를 선언할 수 있습니다. 메시지 유형.

소스는 VAIL을 사용하여 이벤트 전송을 허용할 수 있습니다. PUBLISH 성명서.

소스는 VAIL을 사용하여 데이터 모델 상태를 쿼리할 수 있습니다. SELECT 성명서.

사용 가능한 정확한 작업, 사용된 형식, 사용 가능한 데이터는 소스에 따라 다릅니다.

VAIL 구문 및 의미론

통사론

VAIL 구문은 모든 절차적 요소에 대해서는 JavaScript에서 파생되었으며, 애플리케이션 데이터 모델과의 대부분의 상호 작용에 대해서는 SQL에서 파생되었습니다. VAIL 리소스 순서가 지정된 목록으로 정의됩니다. VAIL 진술서, 다음을 사용하여 텍스트로 저장됨 UTF-8 문자 집합. 이러한 명령문은 순차적으로 실행되며, 현재 명령문이 완료된 후 다음 명령문이 평가됩니다.

VAIL에는 명령문 종료자가 없으며, 명령문을 같은 줄에 합치거나 여러 줄로 나눌 수 있습니다. 그러나 가독성을 위해 한 줄에 최대 하나의 명령문을 사용하고, 필요한 경우 다음 줄로 줄바꿈하는 등 적절한 줄 길이 제한을 준수하는 것이 좋습니다.

코멘트

VAIL은 단일 줄 주석과 다중 줄 주석을 모두 지원합니다. 단일 줄 주석은 다음으로 시작합니다. // 줄의 어느 위치에서나 찾을 수 있습니다. `//“ 이후부터 줄 끝까지의 문자는 주석으로 간주됩니다.

// This is a single line comment
var a = 1 + 1 // This is also a single line comment

여러 줄 주석은 다음으로 시작합니다. /* 그리고 줄의 어느 위치에서나 찾을 수 있습니다. 다음 문자는 /* 새 줄 문자를 포함하여 첫 번째 줄까지 주석의 일부로 간주됩니다. */ 주석 닫기. 여러 줄 주석은 문장의 끝이나 문장 내부에 넣을 수 있습니다.

/* a standalone multi-line comment
   spanning two lines */
var hello = "hello" /* a multi-line comment starting
                   at the end of a statement */
var a = 1 /* one */ + 2 /* two */

VAIL 키워드는 대소문자를 구분하지 않습니다. 다음 키워드는 예약되어 있으므로 리소스 이름(유형, 규칙, 프로시저 등)이나 변수 이름, 매개변수 이름 또는 별칭으로 사용할 수 없습니다.

변경 전에 구성 요소 만들 삭제 드롭
그렇지 않으면 이벤트 스트림 실행 필터링 을 통한 기능
if 삽입하다 자바 지도 지원 순서
게시 return 지배 규칙 집합 고르다 체계
시간 제한 최신 정보 업서트 였다 언제

다음 키워드는 새 문장의 시작 부분에만 나타날 수 있습니다.

변경 만들 드롭 필터링 을 통한 if
지도 return 고르다 시도 업서트 였다

식별자

식별자는 문자나 밑줄로 시작합니다. 숫자로 시작할 수 없습니다.

문자의 범위는 다음과 같습니다.

  • 'a'부터 'z'까지 (소문자 ASCII 문자)
  • 'A'부터 'Z'까지 (대문자 ASCII 문자)

그 다음 문자에는 문자와 숫자가 포함될 수 있습니다.

다음은 유효한 식별자(여기서는 변수 이름)의 몇 가지 예입니다.

var name
var item3
var with_underscore
var _underscoreStart

하지만 다음은 잘못된 식별자입니다.

var 3tier
var a+b
var a#b

전부의 키워드 또한 다음에 사용할 경우 유효한 식별자입니다. 참조 연산자:

foo.if
foo["return"]
foo.upsert

명세서

각 명령문은 VAIL 런타임 시스템이 수행할 작업을 설명합니다. 법적 명령문은 다음과 같습니다.

베일 유형

VAIL 유형 이름은 대소문자를 구분하므로 유형 String 유형과 동일하지 않습니다 string.

표준형

  • String – 문자열
  • Integer – 64비트 수량으로 표현된 정수 값
  • Real – 128비트 부동 소수점 숫자로 표현된 실수 값
  • Decimal – 고정 소수점 십진수
  • Currency – 통화 유형 표시기 및 고정 소수점 십진수
  • Boolean - true or false.
  • DateTime – 특정 시점. DateTime은 외부적으로 ISO 날짜로 표현됩니다.
  • GeoJSON – GeoJSON 객체로서의 위치
  • Object – ~의 대상 이름, 값 쌍
  • ResourceReference – 속성을 가진 문서로 저장된 Vantiq 리소스에 대한 참조 의지   리소스 ID.
  • Map – 매핑을 보유합니다  에 가치 하나 이상의 임의의 키에 대해.
  • Value – 임의의 것을 보유합니다 가치.
  • Any – 실제 유형이 알려지지 않았거나 알 수 없음을 나타냅니다. 이는 다음의 일부로만 사용할 수 있습니다. 절차 서명. 다음을 입력하는 데 사용할 수 있습니다. 프로시저 매개변수 또는 리턴 타입.

유형이 SQL 유형이나 JavaScript 유형과 직접 대응되는 것은 아닙니다. 예를 들어 JavaScript와 유사한 유형은 없습니다. 번호 정수와 부동 소수점을 모두 지원하는 유형입니다. 하지만 문자열, 정수, 실수, 날짜, 객체의 일반적인 동작 방식은 JavaScript와 SQL 사용자 모두에게 익숙할 것입니다.

구체적인 정의는 다음과 같습니다.

문자열은 UTF-8 문자 체인 형태로 표현됩니다. VAIL 문자열 리터럴은 큰따옴표( )로 묶습니다."), 예를 들어:

var a = "string"
myProcedure("this is a string")

문자열 연결

모든 VAIL 문자열은 다음과 연결될 수 있습니다. + 운영자:

var a = "one part" + " of a string"

여러 줄 문자열

문자열은 여러 줄에 걸쳐 있을 수 있으며 시작 및 끝 따옴표 사이의 모든 줄 바꿈 및 공백 문자는 그대로 유지됩니다.

var multiLine = "line one
line two
    indented line three"

탈출 문자

VAIL 문자열은 내장을 지원합니다 탈출 입력하기 어렵거나 모호한 문자를 나타내는 시퀀스입니다. 이스케이프된 문자는 백슬래시(\). 예를 들어, 문자열에 큰따옴표를 삽입하려면 다음을 사용합니다.

var embeddedQuote = "string with a \" in it"

인식되는 이스케이프 문자는 다음과 같습니다.

탈출 시퀀스 캐릭터
\b 백 스페이스 키
\f 폼피드
\n 개행 문자
\r 캐리지 리턴
\s 단일 공간
\t
\\ 백 슬래시
\“ 큰 따옴표

유니코드 이스케이프 시퀀스

키보드에 없는 문자의 경우 유니코드 이스케이프 시퀀스를 사용할 수 있습니다. 즉, 백슬래시, 'u', 4진수 XNUMX자리를 차례로 입력합니다.

예를 들어, 유로화 기호는 다음과 같이 표현할 수 있습니다.

var unicodeEmbed = "The Euro currency symbol: \u20AC"

정수

부호 있는 64비트 값입니다. 허용되는 값 범위는 다음과 같습니다. -9,223,372,036,854,775,808 (-2**63)에서 9,223,372,036,854,775,807 (2**63 -1). 런타임 표현 Integer Java와 동일합니다 Long.

JavaScript 클라이언트(예: 반틱 IDE), 표시 가능한 최대 정수는 JavaScript Number.MAX_SAFE_INTEGER 값인 9,007,199,254,740,991 또는 (2**53 -1)입니다. 이로 인해 UI 대화 상자에 MAX_SAFE_INTEGER보다 큰 값을 반환할 때 표시 문제가 발생할 수 있습니다. 이는 디스플레이에만 나타나는 문제입니다. 일반적으로 표시되는 값은 실제 값보다 정밀도가 낮습니다. 예를 들어 프로시저가 Long.MAX_VALUE를 반환하는 경우 IDE에서는 9223372036854776000으로 표시될 수 있습니다. JavaScript 또는 IDE에서 표시하려면 VAIL을 사용할 수 있습니다. toString() 이 JavaScript 제한을 해결하는 방법입니다. 예를 들어, return myValue.toString().

정수 리터럴 값은 다음과 같이 숫자 문자열을 사용하여 선언됩니다.

var myInt = 12345

부동산

배정밀도 64비트 IEEE 754 부동 소수점 값입니다. 런타임 표현은 다음과 같습니다. Real Java와 동일합니다 Double.

실수 리터럴 값은 소수점을 포함한 숫자 시퀀스를 사용하여 선언됩니다. 예:

var myReal = 123.45
var myRealToo = 12345.0

소수

고정 소수점 십진수. 속성이나 매개변수가 Decimal로 선언되면 규모 지정되어야 합니다. 규모는 Integer 소수점 이하 자릿수를 선언합니다. 소수점 이하 자릿수를 지정하지 않으면 0이 사용되어 Integer 값. 예:

procedure Payroll.changeSalary(empName String, salary Decimal(2))

매개 변수 봉급 로 선언됩니다 Decimal 2자리 정밀도의 값입니다.

선언이 불가능합니다. Decimal 값을 리터럴로 반환합니다. 대신 프로시저 십진법으로 에 사용해야 합니다 Real 문자 또는 String 문자.

JSON 표현 Decimal 값은 String문자열을 사용하면 값을 JSON 표현으로 변환할 때 발생할 수 있는 반올림 오류를 방지할 수 있습니다. JSON 형식은 다음에서도 사용해야 합니다. 쿼리 제약 조건.

이는 Decimal 데이터가 포함된 이벤트를 수신할 때를 의미합니다. 외부 클라이언트(예: Vantiq IDE 또는 Vantiq 클라이언트)에서 Decimal 값은 문자열로 표현됩니다. 대상 토픽이나 소스가 메시지 스키마를 정의하더라도 이러한 값은 자동으로 변환되지 않습니다. 이를 보완하기 위해 다음을 사용할 수 있습니다. 십진법() 비교 및 산술 연산에 사용할 수 있도록 문자열을 다시 Decimal로 변환합니다. 예를 들어, toDecimal(이벤트.온도, 2) > 500 에 조건 이벤트 스트림 활동 패턴이나 IF 또는 WHERE 절에 대한 표현식입니다. 또한 참조하세요. 십진수 및 통화 지원 지원되는 운영자에 대한 자세한 내용은 다음을 참조하세요.

환율

통화 가치(달러, 유로 등)를 나타냅니다. 통화 코드와 Decimal 값. 속성이나 매개변수가 다음과 같이 선언된 경우 Currency a 규모 지정해야 합니다. 축척이 제공되지 않으면 축척 0이 사용되어 Integer 값.

선언이 불가능합니다. Currency 값을 리터럴로 반환합니다. 대신 프로시저 통화로 에 사용해야 합니다 String 문자.

JSON 표현 Currency 값은 String 다음 형식의:

 <currency code>:<value>

어디에

  • 통화 코드 – 모든 통화에 할당된 ISO 4217 코드(예: GBP, USD, JPY, CNY 등)
  • 가치 – 통화 가치를 나타내는 십진수.

속성에 여러 통화 값이 포함될 수 있지만, 사용자는 서로 다른 통화 값이 포함된 속성을 더하는 것과 같은 무의미한 연산을 시도하지 않아야 합니다. 이러한 경우 사용자는 통화 코드별로 그룹화된 값을 더해야 합니다. 이는 통화에 사용되는 표현 방식을 통해 더욱 용이해집니다. 예를 들어, 100달러 이상의 매출을 찾으려는 사용자는 다음과 같은 쿼리를 (가상 쿼리 형식으로) 실행합니다.

select name, sales from store where sales > "USD:100.00"

통화를 반드시 지정해야 한다는 사실로 인해 판매가 USD로 기록된 매장에만 결과가 표시됩니다.

부울

Boolean 진리값을 표현하는 데 사용되는 특수한 데이터 유형입니다. true   falseBoolean 값은 다른 데이터 유형과 마찬가지로 변수에 저장되고 필드에 할당될 수 있습니다.

var myBooleanVariable = true
var untypedBooleanVar = false
obj.booleanField = true

true   false 두 개의 리터럴 부울 값만 있습니다. 그러나 더 복잡한 부울 표현식은 다음을 사용하여 표현할 수 있습니다. 논리 연산자.

날짜 시간

시간축 상의 순간적 지점. DateTime 값은 나노초 정밀도까지 표현할 수 있지만 일반적으로 밀리초보다 더 정밀한 값은 거의 사용되지 않습니다. 런타임 표현은 다음과 같습니다. DateTime Java와 동일합니다 Instant모든 시간은 UT로 정규화되어 여러 시간대에 걸쳐 작업할 때 모호함이 없습니다.

선언이 불가능합니다. DateTime 값을 리터럴로 반환합니다. 대신 프로시저 오늘까지() 다음 중 하나에서 변환하는 데 사용해야 합니다. String 가치 또는 Integer 가치.

JSON 표현 DateTime 하는 String ISO-8601 표현을 사용하여:

yyyy-MM-dd'T'HH:mm:ss[.SSS]'Z'

수락 시 DateTime 가치를 통해 Vantiq 리소스 API 또는 쿼리 제약 조건 시스템은 위의 두 가지 중 하나를 허용합니다. String 형태 또는 Integer "에포크 시간" 값(밀리초)을 포함합니다. 고정밀도 표현에서 저정밀도 표현으로 변환하면 날짜의 고정밀도 구성 요소가 잘립니다.

 

"에포크 시간"은 시간 경과 후의 시간을 말합니다. 1970-01-01T00:00:00Z따라서 "epoch milliseconds"는 그 시간 이후의 밀리초 수입니다.

간격 리터럴

간격 리터럴(일명 간격)은 25분, 1일 또는 24시간과 같은 시간 길이를 나타냅니다. 간격은 생성 시점과 관계없이 항상 동일한 크기를 갖습니다. 따라서 하루는 항상 7시간이며, 일주일은 항상 XNUMX일입니다.

간격은 다음 단위 중 하나로 지정할 수 있습니다.

  • 밀리 초
  • 시간

예 :

23 milliseconds
100 seconds
5 weeks

런타임에 간격 값은 다음과 같이 표현됩니다. Integer 간격의 밀리초 수를 포함합니다.

리소스 참조

Vantiq 리소스 인스턴스에 대한 참조입니다. 참조의 런타임 표현은 다음 속성을 가진 객체입니다.

  • 의지 – 참조되는 리소스
  • 리소스 ID – 참조되는 인스턴스의 리소스 ID

선언이 불가능합니다. ResourceReference 값을 리터럴로 반환합니다. 대신 프로시저 Utils.buildResourceRef() 반드시 사용해야합니다.

JSON 표현 ResourceReference 하는 String 형태 :

/<resource>/<resourceId>

를 사용할 때 REST API 위의 형식은 표준 리소스 API 접두사를 붙여 리소스 인스턴스를 참조하는 URI를 구성하는 데 사용할 수 있습니다.

를 사용할 때 ResourceReference 값 쿼리 제약 조건 JSON 표현을 사용하여 정확한 일치 항목을 쿼리할 수 있습니다. 또한 개별 속성을 쿼리할 수도 있습니다. ResourceReference 다음과 같이 :

SELECT * from MyType WHERE entity.resource == "myresource"

ResourceReference 유형의 속성을 삽입/업데이트할 때 값은 외부 "문자열" 형식이나 내부 "문서" 형식으로 표현될 수 있습니다. 두 형식 모두 허용됩니다.

INSERT MyType(entity: {resource: "types", resourceId: "MyType"})
INSERT MyType(entity: "/types/MyType")

목적

JSON 객체입니다. Object 인스턴스는 0개 이상의 속성을 포함하며, 각 속성은 값에 바인딩됩니다. 객체 인스턴스는 다음 구문을 사용하여 객체 리터럴 표현식을 사용하여 생성할 수 있습니다.

objectLiteral := { [<propertyDeclaration>][, <propertyDeclaration>]* }

propertyDeclaration := <propertyName> : <propertyValue>

propertyName := any legal identifier

propertyValue := any value expression

예 :

var myObj = {
    prop1: "property value",
    prop2: myProc()
}

GeoJSON

점, 선 문자열 또는 다각형입니다. 값은 두 가지 속성을 포함하는 JSON 객체로 표현됩니다.

{"type": ["Point" | "LineString" | "Polygon"], "coordinates": <valueSpec>}

The 값 사양 점, 선 또는 다각형의 지리좌표 배열을 명시하며, 각 지리좌표는 두 개 또는 세 개의 값(경도와 위도(순서대로))과 고도(미터)를 포함하는 배열로 구성됩니다. 점의 경우 좌표는 두 개(또는 세 개)의 값을 포함하는 단일 배열입니다. 반면 선분(LineSegments)과 다각형의 경우 좌표는 지리좌표 배열을 포함하는 배열입니다. 각 중첩 배열은 경도와 위도(고도(미터))를 나타내는 두 개(또는 세 개)의 값을 포함합니다.

좌표를 관찰하세요 유형 MUST 올바르게 대문자로 시작해야 하며, 특히 "Point", "LineString" 또는 "Polygon" 문자열 중 하나여야 합니다.

GeoJSON 리터럴은 다음과 같습니다. Object 적절한 속성을 가진 리터럴, 예:

var aPoint = {
  type: "Point", 
  coordinates: [-122.4194155, 37.7749295] 
}

var polygon = {
  type: "Polygon", 
  coordinates: [
    [ [84.0, 40.0], [84.0, 41.0], [88.0, 41.0], [88.0, 40.0], [84.0, 40.0] ]
  ] 
}

// Point with altitude

aPoint = {
  type: "Point", 
  coordinates: [-151.00708, 63.06909, 6190] 
}

지도

Map 인스턴스에는 0개 이상의 키가 포함되어 있으며, 각 키는 null이 아닌 값에 바인딩됩니다. Map 인스턴스는 내장된 기능을 사용하여 생성됩니다. Concurrent.Map() 또는 Concurrent.Cache() 생성자를 지원하고 모든 문서화된 절차를 지원합니다. 이 유형의 속성은 다음과 같습니다.

  • 복제 지원
  • 5월 지원 지속되다

가치관

Value 인스턴스에는 단일 값이 포함될 수 있습니다. nullValue 인스턴스는 내장된 기능을 사용하여 생성됩니다. 동시 값() 생성자이며 모든 문서화된 절차를 지원합니다. 이 유형의 속성은 다음과 같습니다.

  • 복제 지원
  • 5월 지원 지속되다

애플리케이션 정의 유형

EDA는 자체적으로 정의할 수 있습니다. 유형 처리하는 데이터를 나타냅니다. 이러한 유형은 어디에서나 사용할 수 있습니다. 표준형 사용할 수 있습니다. 런타임에는 다음과 같이 처리됩니다. Object 검증 및 변환을 목적으로 합니다.

Collections

VAIL은 다음과 같은 형태의 컬렉션을 지원합니다. ArraysJavaScript 배열과 유사하며 Sequences. 그것은 또한 허용 Object 키/값 쌍의 컬렉션으로 처리되는 값입니다.

배열

배열은 동적으로 확장되는 요소들의 집합으로, 각 요소는 배열의 "슬롯"에 배치됩니다. 슬롯은 인덱스 번호로 직접 주소가 지정됩니다. 슬롯은 0부터 N까지 번호가 매겨지며, 여기서 N은 배열의 크기에서 1을 뺀 값입니다. 새로운 요소는 배열의 시작이나 끝에 추가될 수 있습니다. 배열은 다음을 사용하여 반복될 수 있습니다. FOR 성명서. 우리는 때때로 용어를 사용합니다 명부 배열을 참조합니다.

배열 리터럴은 다음 구문을 사용하여 선언됩니다.

"[" [<valueExpression>] [, <valueExpression>]* "]"

예 :

var intArray = [1, 2, 3, 4, 5]
var emptyArray = []

배열은 메모리에 저장됩니다. 따라서 배열의 최대 크기는 제한되어 있습니다. Vantiq 강하게 배열의 요소 수는 10,000개 미만으로 제한됩니다. 향후 릴리스에서는 배열의 요소 크기를 10,000개로 제한합니다. 시행됩니다 런타임 시스템에 의해.

시퀀스

시퀀스 역시 요소의 집합이지만, 배열과는 달리 시퀀스는 다음과 같습니다.

  • 무제한 – 시퀀스는 임의의 수의 요소를 포함할 수 있습니다.
  • 게으름 – 시퀀스의 요소가 요청에 따라 구체화됩니다.
  • 불변성 – 시퀀스의 내용은 변경될 수 없고 시퀀스에 무작위로 접근할 수 없습니다.

시퀀스는 다음과 같은 명령문을 사용하여 새로운 시퀀스로 변환될 수 있습니다. FILTER   MAP, 그리고 반복해서 사용할 수 있습니다. FOR. 참조 되풀이 자세한 내용은.

몇 가지 제한이 있지만 일반적으로 시퀀스는 원격으로 전송될 수 있습니다. 프로시저가 시퀀스를 반환할 시점을 명시적으로 선언하는 것이 가장 좋습니다. 리턴 타입 절차를 위해.

사물

모든 품종 Object 값은 컬렉션으로 처리될 수 있으며 다음을 사용하여 처리될 수 있습니다. 되풀이. 개체의 각 속성에 대해 하나의 항목이 생성됩니다. 이러한 항목에는 다음 속성이 있습니다.    가치 (속성 이름과 속성 값에 해당). 예:

// Create object instance
var myObj = {
    prop1: "property value",
    prop2: 10
}

// Iterate over the object's properties
for (prop in myObj) {
    log.info("Prop Name " + prop.key + " value: " + prop.value)
}

유형 변환

Vantiq는 다음과 같은 자동 유형 변환을 수행합니다.

시작\끝 정수 부동산 소수 환율 부울 날짜 시간
1
1
1
1
4
1
정수
2
부동산
2
소수
부울
환율
날짜 시간
3
  1. 문자열의 내용은 대상 유형의 형식을 따라야 합니다.
  2. 지원되는 값은 0(false) 및 1 (true).
  3. 에포크 밀리초로 변환됩니다(나노초는 잘립니다).
  4. 다음으로 변환 true 문자열이 null이 아니고 대소문자를 구분하지 않고 문자열 "true"와 같으면 를 반환합니다. 그렇지 않으면 를 반환합니다. false.

유형의 값 Object   GeoJSON 서로 간에는 변환이 가능하지만 다른 유형으로/에서 변환할 수는 없습니다. Object 에 GeoJSON시스템은 필요한 속성이 있는지 확인합니다.

이러한 변환은 다음과 같은 경우 발생합니다.

  • 리소스 인스턴스의 속성에 값을 저장합니다.
  • 선언된 유형을 사용하여 프로시저 매개변수에 값을 전달합니다.
  • 반환 유형이 있는 프로시저에서 값을 반환합니다.

참조 십진수 및 통화 지원 지원되는 운영자에 대한 자세한 내용은 다음을 참조하세요.

연산자

산술 연산자

VAIL은 JavaScript와 같은 다른 프로그래밍 언어나 수학에서 흔히 볼 수 있는 친숙한 산술 연산자를 지원합니다.

이진 연산자

운영자 목적
+ 추가
- 뺄셈
* 곱셈
/ 분할
% 나머지
** 출력

단항 연산자

모두 +   - 접두사, 단항 연산자로 사용할 수 있습니다. 예:

var minusOne = -1
var positiveOne = -(-1)
positiveOne = +1

단항 산술 연산자의 관점에서, ++ (증가) 및 -- (감소) 연산자는 후위 표기법으로 사용할 수 있습니다. 이 연산자는 값을 반환합니다. 전에 증가/감소.

할당 산술 연산자

위에서 살펴본 이진 산술 연산자는 (power를 제외하고) 할당 형식으로도 사용할 수 있습니다.**)) :

  • +=
  • -=
  • *=
  • /=
  • %=

예 :

var a = 3
a += 4 // result is 7
a -= 1 // result is 6
a *= 2 // result is 12
a /= 3 // result is 4
a %= 3 // result is 1

관계 연산자

관계 연산자는 값을 비교하여 두 값이 같은지 다른지, 또는 한 값이 다른 값보다 크거나, 작거나, 같은지 알아내는 데 사용됩니다.

다음 연산자를 사용할 수 있습니다.

운영자 목적
== 같은
!= 다른
< 이하
<= 이하
> 보다 큰
>= 크거나 같음

VAIL은 JavaScript를 지원하지 않습니다. 정체 운영자 (===).

이러한 연산자는 모든 유형의 값에 적용할 수 있습니다. 각 유형은 비교에 고유한 의미를 적용합니다. 예를 들면 다음과 같습니다.

var isFalse = 2 > 11 // Numerically 2 is not greater than 11
var isTrue = "2" > "11" // Lexically the string "2" is greater than the string "11"

논리 연산자

VAIL은 세 가지 논리 연산자를 제공합니다. Boolean 표현:

  • && – 논리적인 "그리고"
  • || – 논리적인 "또는"
  • ! – 논리적인 "아니오"

예 :

var isTrue = true && true
isTrue = true || false
isTrue = !false

상위

논리적 "아니요"(!)는 논리적 "and"(&&).

var isFalse = (!false && false)

논리적 "그리고"(&&)는 논리적 "또는"보다 우선순위가 높습니다.||).

var isTrue = true || true && false

JavaScript와 달리 VAIL 하지 않습니다 대부분의 경우 논리 연산자의 단락 회로를 구현합니다. 특히 중요한 것은 지원 논리 표현식에 사용되는 단락 회로 프로시저 호출. 예를 들어, 다음 표현식이 주어지면 (true || myProc()), 베일 결제 게이트웨이, 절차를 실행하다 myProc.

조건 연산자

삼항 연산자

삼항 연산자는 변수에 어떤 값을 할당하는 if/else 분기와 동일한 단축 표현식입니다.

대신에:

if (string !=null && string.length() > 0) {
    result = "Found"
} else {
    result = "Not found"
}

당신은 쓸 수 있습니다:

result = (string != null && string.length() > 0) ? "Found" : "Not found"

참조 연산자

첨자

아래 첨자 연산자([])는 데이터에 액세스하고 저장하는 데 모두 사용할 수 있습니다. Object or Array 값. 또한 데이터에 액세스하는 데 사용할 수 있지만 저장할 수는 없습니다. Map 값. 구문은 다음과 같습니다(이 경우 [   ] 문자는 리터럴로 해석되어야 합니다):

subscriptExpression := <object, map or array>[<subscript>]

subscript := <numeric value> | <alphanumeric value>

와 함께 사용할 경우 Object or Map 값, 아래 첨자는 다음과 같이 해석됩니다. String 속성 이름/키에 해당합니다. Array 값, 아래 첨자는 다음과 같이 해석됩니다. Integer 배열 내 항목의 인덱스에 해당합니다. 존재하지 않는 항목에 액세스하면 다음이 반환됩니다. null. 값을 설정 Array 아직 존재하지 않는 인덱스에서 이전 인덱스가 "채워지게" 됩니다. null values.

연산자는 모든 표현식과 할당문의 양쪽에 나타날 수 있습니다. 예를 들면 다음과 같습니다.

// Here we are accessing properties of an object
var obj = {}
obj["prop1"] = 42
var prop1Value = obj["prop1"]
var nullValue = obj["noSuchPoperty"]

// Here we are accessing into an array by index
var arrayValue = []
arrayValue[10] = 42
var setValue = arrayValue[10]
var nullValue = arrayValue[15]
var size = arrayValue.size() // the result here is 11

위에서 언급했듯이 참조 연산자를 사용하는 경우 Map 가치는 데이터 접근에만 국한되며, 저장에는 적용되지 않습니다. 따라서 다음 사항은 합법적입니다.

var myMap = Concurrent.Map()
myMap.put("key", "value")
var value = myMap["key"]

하지만 이것은 그렇지 않습니다.

var myMap = Concurrent.Map()
myMap["key"] = "value"

속성 참조

속성 참조 연산자(.)는 속성의 데이터에 액세스하고 저장하는 데 사용됩니다. Object 값 및 데이터에 액세스하려면 Map 값. 속성 참조는 다음과 같은 형식을 취합니다.

<variableName>.<propertyName>

이것은 아래 첨자 연산자 에 적용될 때 Object or Map 값.

배열의 속성과 요소에 대한 참조는 다음과 같이 결합될 수 있습니다.

<variableName[<indexValue>].<propertyName>[<indexValue].<subPropName>

람다 연산자

람다 연산자(=>)는 다음과 같은 형태의 함수 표현식을 정의하는 데 사용됩니다.

<functionParams> => <VAIL expression> | { [VAIL Statements]* }

functionParams := () | <parameterName> | ([<parameterName>[, <parameterName>]*])

paramterName := VAIL Identifier

표현식의 왼쪽은 함수에서 기대하는 매개변수를 정의합니다. 이러한 매개변수는 0개 이상 있을 수 있습니다. 선언된 각 매개변수는 암시적인 매개변수를 정의합니다. 변수 이름 함수 본문(표현식 또는 시퀀스일 수 있음)에서 볼 수 있는 VAIL 진술서). 함수 표현식의 주요 사용은 다음과 함께 사용됩니다. 병발 사정 서비스. 예:

var concurrentMap = Concurrent.Map()
concurrentMap.compute("key1", (key, currentValue) => {
    if (currentValue == null) {
        return 0
    }
    return currentValue + 5
})

여기서 우리는 두 번째 매개변수로 함수 표현식을 갖습니다. compute 순서이 함수는 2개의 매개변수로 호출됩니다.    현재값 그리고 반환합니다 Integer 가치 지도의 상태에 따라 다릅니다(하지만 이 예에서는 항상 알려져 있습니다).

십진수 및 통화 지원

The 산술 연산자 에서 지원됩니다 Currency   Decimal 나머지를 제외한 유형 (%) 연산자. 혼합 숫자 유형에 대한 산술은 다음 사이에서 지원됩니다. Decimal/Currency 값 및 모든 IntegerRealDecimal or Currency 변수에 저장되거나 상수로 표현되는 값. 예를 들어, 마이덱 는 다음을 포함하는 변수입니다. Decimal 가치와 마이커 는 다음을 포함하는 변수입니다. Currency 값의 경우 다음 표현식이 지원됩니다.

myDec * myDec
myDec + 12
myDec - 100
myDec * 2

myCur * myCur
myCur + 12
myCur - 100
2 * myCur
myCur / 4
myCur ** 2

"USD:12.0" + myCur
"20.0" * myDec

관계 연산자 항상 왼쪽 피연산자의 유형에 따라 비교 유형을 결정하십시오. 따라서 왼쪽 피연산자가 Decimal or Currency 값의 경우 오른쪽 피연산자는 다음으로 변환됩니다. Decimal or Currency 값과 비교가 수행됩니다. 그러나 왼쪽 피연산자가 IntegerReal or String 오른쪽 피연산자를 해당 유형으로 변환하려고 시도합니다. 오른쪽 피연산자가 Decimal or Currency 값, 이 변환은 실패하여 다음과 같은 결과를 초래합니다. IllegalArgumentException가장 간단한 방법은 항상 다음을 만드는 것입니다. Decimal or Currency 모든 비교에서 왼쪽 피연산자의 값을 지정합니다. 이것이 가능하지 않은 경우 왼쪽 피연산자를 명시적으로 변환해야 합니다. Decimal 를 사용하여 십진법() 순서 (변환 Currency 에 Number (현재 지원되지 않습니다).

유효한 비교의 예 Decimal   Currency:

myDec >= "100.42"
myCur < "USD:100.00"
toDecimal("100.42") < myDec
toCurrency("USD:100.00") == "USD:100.42"
myCur == myCur

지원되지 않는 비교의 예는 다음과 같습니다.

"USD:100.00" <= myCur
50.0 < "22.25"

때 두 Decimal or Currency 계산에 값이 포함되는 경우 결과의 크기는 다음과 같이 설정됩니다.

  • 추가 – 두 피연산자에 할당된 더 큰 스케일
  • 뺄셈 – 두 피연산자에 할당된 더 큰 스케일
  • 곱셈 – 두 피연산자에 할당된 스케일의 곱
  • 분할 – 나누는 수의 크기를 피제수의 크기에서 뺍니다.

물론, 결과 값이 유형이 다음과 같은 속성에 할당되는 경우 Decimal or Currency, 규모는 해당 부동산에 대해 선언된 규모로 설정됩니다.

 

패키지

패키지 선언

The package 선언문은 VAIL 리소스를 선언하는 데 사용되는 텍스트의 첫 번째 비주석 줄이어야 합니다. 구문은 다음과 같습니다.

packageStatement := package <packageName>

packageName := <identifier>[.<identifier>]*

패키지 이름 io.vantiq   system 예약되어 있으므로 사용할 수 없습니다.

리소스 가져오기

사용 년 import 이 명령문을 사용하면 리소스 인스턴스를 간단한 이름(일반적으로 마지막 "." 뒤의 부분) 또는 지정된 별칭(제공된 경우)으로 참조할 수 있습니다. 구문은 다음과 같습니다.

resourceImport := import <resource> <resourceId> [as <alias>]

alias := <simple resource id>

에 대한 가치 의지 다음 중 하나일 수 있습니다: 서비스순서유형화제 글렌데일 이벤트 스트림. 형식 및 기대 사항 리소스 ID   별명 가져오는 리소스에 따라 다릅니다. 별칭은 항상 대상 리소스에 대한 정규화되지 않은 형식이어야 합니다.

서비스 절차에 액세스하려면 다음을 가져와야 합니다. 서비스개별 서비스 절차를 가져오는 것은 지원되지 않습니다.

import 문은 패키지 문이 있는 경우에만 유효합니다. 패키지 문 뒤, 리소스 선언 앞에 나와야 합니다.

변수

변수 선언

규칙이나 프로시저 본문 내에서 생성된 변수는 사용하기 전에 선언해야 합니다. 변수는 다음과 같은 변수 선언 구문을 사용하여 선언합니다.

var <variableName>

이렇게 하면 이름이 지정된 새 변수가 생성됩니다. 변수 이름변수 이름은 대소문자를 구분하며 영숫자, 밑줄로 구성되어야 합니다. 변수 이름은 숫자로 시작할 수 없습니다.

편의상, 다음 표기법을 사용하여 단일 문장으로 변수를 선언하고 값을 할당할 수 있습니다.

var <variableName> = <expression>

변수는 전역적으로 표시됩니다. 지배 or 순서 정의된 범위 내에서만 정의됩니다. 다음을 포함하여 해당 범위 밖에서 정의된 변수는 "숨길" 수 없습니다.

변수를 다시 선언하는 것은 가능하지만 권장하지는 않습니다.

암시적 변수 선언

변수의 암묵적 선언이 필요한 상황은 여러 가지가 있습니다.

변수 참조

여러 VAIL 연산은 명령문의 대상을 동적으로 지정하기 위해 변수 참조 사용을 지원합니다. 변수 참조는 다음과 같은 형식을 갖습니다. @<variableName> 시스템이 변수의 현재 값을 대상 리소스의 이름으로 사용해야 함을 나타냅니다. 예를 들어, 다음 코드는 다음과 같습니다.

var variableName = "Sensor"
SELECT * FROM @variableName AS s

시스템이 해당 유형에 대해 SELECT를 실행하게 됩니다. 감지기 그리고 이는 다음과 동일합니다.

SELECT * FROM Sensor as s

각 작업에 대한 설명서에는 이 구조가 명시적으로 지원되는 경우/지원 여부가 표시됩니다(언급되지 않으면 해당 맥락에서 지원되지 않는다는 것을 의미합니다).

할당

변수에 값을 할당하는 데는 전통적인 할당문을 사용할 수 있습니다. 할당 예시는 다음과 같습니다.

myVar = 5 + 10

기존 변수에 이름을 지정합니다. 마이바 정수 값 15로. 보다 일반적으로:

<variableName> = <expression>

흐름 제어

IF

The IF 문장은 조건부 실행을 제공합니다. 여러 절로 구성되며, 그중 하나만 필수입니다. 구문은 다음과 같습니다.

if (<logicalExpression>) {
    <VAIL Statements>*
} [ else if (<logicalExpression>) {
    <VAIL Statements>*  
}]*
[ else {
  <VAIL Statements>*  
}]

The logicalExpression 결과가 나와야 합니다 Boolean 값입니다. 표현식을 포함할 수 있습니다. 관계 연산자 를 사용하여 결합 논리 연산자.

논리 표현식은 초기부터 시작하여 한 번에 하나씩 평가됩니다. IF 조항 및 각 조항을 통한 진행 ELSE IF 절은 작성된 순서대로 작성됩니다. 평가할 첫 번째 항목은 true 연관된 VAIL 문 블록이 실행됩니다. 이 경우 추가 평가는 수행되지 않습니다. 어떤 조건도 다음과 같이 평가되지 않으면 true 그런 다음 이와 관련된 진술 ELSE 해당 조항(있는 경우)이 실행됩니다.

TRY

The TRY 진술은 방법을 제공합니다 CATCH (차단) 규칙이나 프로시저를 실행하는 동안 발생하는 오류입니다. 규칙이나 프로시저 실행 중 오류가 발생하면 시스템은 예외 이로 인해 실행이 종료되고 현재 네임스페이스의 오류 로그에 항목이 기록됩니다. 그러나 오류가 다음 컨텍스트에서 발생하는 경우 TRY 문장이 나오면 오류는 전달됩니다. CATCH 오류가 발생하지 않은 것처럼 블록과 처리가 계속됩니다. 명령문의 일반적인 형식은 다음과 같습니다.

try {
    <VAIL Statements>*
} catch(errorVar) {
    <VAIL Statements>*
} [finally {
    <VAIL Statements>*
}]

진술서 작성이 완료되면 CATCH 블록 처리가 다음에 오는 모든 명령문에 대해 계속됩니다. TRY 오류 처리 명령문 자체가 오류를 생성하지 않는 한(이 시점에서 제어가 다음 명령문으로 전달됨) 명령문은 CATCH 둘러싸는 블록 TRY (해당 진술이 없거나 그러한 진술이 없으면 해고로 이어질 수 있음).

이외에도 CATCH 블록(필수이지만 비어 있을 수 있음)에는 선택 사항이 있을 수 있습니다. FINALLY 블록. 이 블록에 있는 명령문은 블록이 종료될 때마다 실행됩니다. 명령문이 정상적으로 완료되었거나 실행 중 오류가 발생했는지 여부는 중요하지 않습니다.

되풀이

VAIL은 반복을 위한 여러 가지 방법을 제공합니다. 컬렉션 가치의.

위한

The FOR 다음 구문을 사용하여 컬렉션의 요소를 반복합니다.

for (<iterationVariable> in <collection> [until <terminationCondition>]) {
    <VAIL statements>*
}

The iterationVariable 는 각 요소에 의해 채워지는 암묵적으로 정의된 변수입니다. collection 처리되는 대로. collection 는 법적 조건 중 하나로 평가되어야 하는 표현식 또는 변수입니다. 컬렉션 유형. 존재하는 경우 선택 사항 UNTIL 절은 각 반복 후에 평가될 논리적 조건을 지정합니다. 조건이 다음과 같이 평가되는 경우 true 그러면 반복이 종료됩니다. 그렇지 않으면 본문의 명령문이 FOR 컬렉션의 각 요소에 대해 한 번씩 실행됩니다.

예를 들어,

var Orders = ... get a collection of orders ...
for (o in Orders) {
    if (o.total > 1000) {
        PUBLISH { message: "Thank you for your order" }
            TO SOURCE companyEmail
            USING { recipients: [ o.customerEmail ] }
    }
}

이렇게 하면 모든 주문을 검사하고 총액이 1,000을 초과하는 각 고객에게 감사 이메일을 보냅니다. 다음은 유사한 예제입니다. SELECT 표현식:

for (o in SELECT * FROM Orders WHERE total > 1000) {
    PUBLISH { message: "Thank you for your order" }
        TO SOURCE companyEmail
        USING { recipients: [ o.customerEmail ] }
}

이렇게 하면 총 주문 수가 1,000개를 넘는 주문만 선택되어 각 고객에게 감사 이메일이 전송됩니다.

The FOR 이 문장은 객체의 속성에 대한 반복을 지원합니다.

var foundPaul = false
var person = {name: "paul", address: "11 Main Street", salary: 200}
for (prop in person) {
    if (prop.key == "name" && prop.value == "paul") {
        foundPaul = true
    }
}
if (foundPaul == true) {
    person.status = "employee"
}

비록 약간 인위적이기는 하지만 위의 코드 조각은 속성을 찾기 위해 객체를 검색합니다. name 그리고 속성 값이 문자열인지 확인하세요. paul테스트가 성공하면 개체에 새 속성이 추가됩니다. 다음에 FOR 문은 개체의 속성을 반복하는 데 사용되며 추가된 속성은 본문에서 처리됩니다. FOR. 인스턴스마다 구조가 바뀔 수 있는 객체를 처리하는 경우 객체의 속성을 반복하는 것이 매우 유용할 수 있습니다.

반복과 함께 FOR 예를 들어, 컬렉션의 모든 요소가 처리되기 전에 종료될 수 있습니다.

var total = 0
for (i in range(1,10,1) until total >= 12) {
    total += i
}

완료 시 총 값은 15이며 1 + 2 + 3 + 4 + 5로 계산됩니다. until 절은 각 루프 반복의 끝에서 평가되므로 FOR 위의 루프는 total이 12보다 크거나 같은 반복 후에 종료됩니다.

FILTER

FILTER 문은 다음을 허용합니다. 수집 입력으로 사용하고 요소를 반복하여 새로운 것을 생성합니다. 순서 그 결과로. 구문은 다음과 같습니다.

filter (<iterationVariable> in <collection> [until <terminationCondition>]) {
    <VAIL statements>*
}

The iterationVariable 는 각 요소에 의해 채워지는 암묵적으로 정의된 변수입니다. collection 처리되는 대로. collection 는 법적 조건 중 하나로 평가되어야 하는 표현식 또는 변수입니다. 컬렉션 유형. 존재하는 경우 선택 사항 UNTIL 절은 각 반복 후에 평가될 논리적 조건을 지정합니다. 조건이 다음과 같이 평가되는 경우 true 그러면 반복이 종료됩니다. 그렇지 않으면 본문의 명령문이 FILTER 컬렉션의 각 요소에 대해 한 번씩 실행됩니다. 처리된 각 요소에 대해 본문의 VAIL 문이 실행되어 해당 요소가 결과 시퀀스에 나타나야 하는지 여부를 확인합니다. 결과는 true 는 요소가 시퀀스에 나타난다는 것을 의미하고, 그렇지 않으면 나타나지 않습니다.

예 :

var user = SELECT ONE * From MyUser as user WHERE name == "paul"
var locFilter = FILTER (r in SELECT * FROM PossibleActions) {
    if (r.location == user.location) {
        return true
    }
    else {
        return false
    }
}

이 경우에는 필터를 직접 적용한다는 점에 유의하세요. SELECT 성명서 중간 변수를 사용하는 대신. 이를 통해 시스템은 SELECT의 출력을 시퀀스로 처리하고 모든 결과를 구체화하지 않아도 됩니다. locFilter 변수에는 시퀀스도 포함되어 있으며, 시퀀스는 다음을 사용하여 추가로 처리할 수 있습니다. FOR 또는 MAP 진술이나 사건 또 다른 FILTER같은 :

var typeFilter = FILTER (r in locFilter) {
    return r.type == user.type
}

첫 번째 필터는 "PossibleActions"의 모든 객체를 반복하여 사용자 위치에 적합한 모든 가능한 동작으로 구성된 결과를 반환합니다. 두 번째 필터는 "PossibleActions"의 모든 객체를 반복하여 결과를 반환합니다. loc필터 또 다른 제약 조건을 적용하여 가능한 작업 세트를 사용자 유형과 관련된 작업으로만 줄입니다.

이런 방식으로 시퀀스를 사용하고 연속적인 처리를 적용하는 것은 대량의 데이터를 처리하는 가장 효율적인 방법입니다(그리고 배열 크기 제한을 초과하는 결과 세트를 처리하는 유일한 방법입니다).

MAP

MAP 문은 다음을 허용합니다. 수집 입력으로 사용하고 요소를 반복하여 수정된 결과를 생성합니다. 수집 MAP 본문에서 반환된 모든 요소로 구성됩니다. MAP 문의 본문은 각 요소의 값을 수정하거나 완전히 새로운 요소를 생성할 수도 있습니다. 구문은 다음과 같습니다.

map (<iterationVariable> in <collection> [until <terminationCondition>]) {
    <VAIL statements>*
}

The iterationVariable 는 각 요소에 의해 채워지는 암묵적으로 정의된 변수입니다. collection 처리되는 대로. collection 는 법적 조건 중 하나로 평가되어야 하는 표현식 또는 변수입니다. 컬렉션 유형. 존재하는 경우 선택 사항 UNTIL 절은 각 반복 후에 평가될 논리적 조건을 지정합니다. 조건이 다음과 같이 평가되는 경우 true 그러면 반복이 종료됩니다. 그렇지 않으면 본문의 명령문이 MAP 컬렉션의 각 요소에 대해 한 번씩 실행됩니다.

다음 예제는 모든 직원의 급여를 10%씩 인상한 시퀀스를 생성합니다.

var employeesWithRaises = MAP (r in SELECT * FROM Employee) {
    r.salary += (r.salary * 0.10)
    return r
}

결과 순서 지원되는 모든 곳에서 사용할 수 있습니다. FOR 성명서 내용을 추가로 처리합니다.

프로시저 실행

VAIL에서는 프로시저 호출을 독립형 명령문이나 표현식의 일부로 수행할 수 있습니다. 프로시저 호출을 표현하는 데는 세 가지 다른 형식이 사용됩니다.

직접 호출

프로시저 이름과 매개변수를 괄호로 묶어 지정하여 프로시저를 직접 호출할 수 있습니다. 매개변수는 위치 또는 이름으로 지정할 수 있습니다. 구문은 다음과 같습니다.

directInvocation := <targetProcedure>(<actualParameters>)

actualParameters := <emptyArguments> | <positionalArguments> | <namedArguments>

emptyArguments := 

positionalArguments = <valueExpression> [, <valueExpression>]*

namedArguments = <parameterName>: <valueExpression> [, <parameterName>: <valueExpression>]*

The targetProcedure 프로시저의 정규화된 이름이며, 서비스가 있는 경우 해당 서비스도 포함합니다. 위치 매개변수는 지정된 순서대로 선언된 매개변수에 바인딩됩니다. 명명된 매개변수는 제공된 parameterName 따라서 어떤 순서로든 나타날 수 있습니다. 두 가지 방법 중 하나를 사용하여 매개변수를 지정할 때, 필수 매개변수가 아니거나 기본값이 있는 경우 매개변수를 생략할 수 있습니다. 모든 매개변수는 명명된 매개변수이거나 위치 매개변수여야 합니다. 명명된 매개변수와 위치 매개변수를 함께 사용하는 것은 지원되지 않습니다.

예를 들어, 이전에 표시된 것을 호출하려면 급여.급여 변경 두 개의 매개변수가 있는 프로시저 직원 이름   봉급 다음 호출을 사용할 수 있습니다.

Payroll.changeSalary("Some Employee", 30000.00)

마찬가지로 동일한 호출에 대해 명명된 매개변수를 제공하려면 다음을 수행합니다.

Payroll.changeSalary(empName: "Some Employee", salary: 30000.00)

메서드 스타일 호출

내장 프로시저 중 다수는 JavaScript 메서드 호출과 유사한 "메서드 스타일"이라고 할 수 있습니다. 구문은 다음과 같습니다.

methodInvocation := <receiver>.<directInvocation>

이 스타일을 사용하여 프로시저를 호출하면 receiver 항상 프로시저의 첫 번째 매개변수로 전달됩니다. 고전적인 예는 다음과 같습니다. 길이 문자열을 첫 번째 매개변수로 갖는 프로시저로 호출되는 문자열에 적용되는 프로시저:

var myString = "a string"
var l = length(myString)

메서드 스타일을 사용하면 동일한 프로시저 호출이 다음과 같은 형식을 갖습니다.

var myString = "a string"
var l = myString.length()

실행

이전 두 가지 프로시저 호출 스타일은 잘 알려진 프로시저의 로컬 동기 실행을 수행합니다. EXECUTE 키워드는 비동기 실행, 동적 실행, 분할 실행 및 원격 실행을 지원하여 이를 확장합니다. 구문은 다음과 같습니다.

EXECUTE [ASYNC] <targetProcedure> | * (<actualParameters>)
[WHERE <procedureConstraint>]
[WITH partitionKey = <value>]
[<processedByClause>]

비동기 실행

기본적으로 모든 프로시저는 "동기적으로" 실행됩니다. 즉, 프로시저 호출 이후의 모든 명령문이나 표현식은 프로시저가 완료되고 생성된 값을 반환할 때까지 실행되지 않습니다. ASYNC 수정자 호출자는 프로시저가 호출되어야 함을 나타낼 수 있습니다. 비동기 적으로이 옵션을 사용하면 호출자는 프로시저가 실행되는 동안 다음 명령문으로 계속 진행하며, 경우에 따라 동시에 실행될 수도 있습니다. 비동기적으로 호출되는 프로시저는 다음과 같습니다.

  • 반드시 진술문이어야 하며, 표현의 일부로 사용될 수 없습니다.
  • 사용하여 호출됩니다 가치로 부르다 매개변수 전달 의미론.
  • 모든 워크플로 관리(할당량이라고도 함) 제어가 적용됩니다.
  • 그들이 생산하는 모든 가치는 버려집니다.

예 :

EXECUTE ASYNC Payroll.changeSalary("Some Employee", 30000.00)
// At this point the procedure may not have started, may have completed, 
// or may be still executing.

동적 실행

실행할 프로시저의 이름이 런타임까지 알려지지 않는 경우가 있습니다. 이 경우 프로시저 이름을 동적으로 선택해야 합니다. EXECUTE 프로시저 이름을 동적으로 선택하기 위한 특수 표기법을 지원합니다.

EXECUTE * (<actualParameters>) WHERE <procedureConstraint>

이 역동적인 형태에서 EXECUTE, 프로시저 이름이 지정되지 않았습니다. EXECUTE 키워드. 실제 매개변수만 지정됩니다. 프로시저는 다음을 쿼리하여 선택됩니다. 절차 리소스 지정된 프로시저 제약 조건과 일치하는 인스턴스 집합의 경우(항상 제외됨) 개인 절차). 모든 매칭된 프로시저는 동시에 실행되며, 모든 실행이 완료되면 명령문이 완료됩니다.

발급 결과 EXECUTE 와 함께 진술 WHERE 조항은 항상 프로시저 결과의 배열이며, 실행되는 각 프로시저마다 하나의 항목이 있습니다. 각 프로시저는 비동기적으로 실행될 수 있으므로 실행 순서는 정해지지 않습니다. 프로시저 중 하나라도 예외 그러면 해당 명령문은 동일한 예외를 생성합니다(이전에 실행된 프로시저에서 생성된 모든 값은 무시함).

간단한 예로 변수의 값에 따라 프로시저를 선택합니다.

var procName = "paul"
if (a == 1) {
    procName = "sharon"
}
EXECUTE * ("parm1", "parm2") WHERE name == procName

이렇게 하면 다음 이름의 프로시저가 실행됩니다.  또는 다음과 같은 이름의 프로시저: 샤론 변수의 값에 따라: a.

이름이 아닌 다른 기준으로 절차를 선택하기 위한 편리한 기술은 값에 따라 요청을 적격화하는 것입니다. 속성 인간을 절차 자원. 그만큼 속성 프로시저가 정의될 ​​때 값을 설정할 수 있습니다. WITH 절. 예를 들어, 속성 프로시저의 경우 다음 형식의 객체가 포함됩니다.

{ role: "manager" }

다음 EXECUTE 이 명령문은 역할로 "manager" 값이 할당된 모든 프로시저를 호출합니다.

EXECUTE * (1, 2, 3) WHERE ars_properties.role == "manager"

을 참조 절차 값 할당에 대한 자세한 설명은 섹션을 참조하세요. 속성.

분할 실행

대부분의 상황에서 시스템은 프로시저가 분할된 상태에 액세스할 시기를 결정하고 요청을 올바르게 라우팅하는 데 필요한 정보가 있는지 확인할 수 있습니다(첫 번째 매개변수를 분할 키로 사용). 그러나 다음을 호출할 때 private 절차 서비스 이벤트 핸들러 또는 충돌하는 서비스 절차에서 상태 접근 수정자, 이것은 불가능합니다. 대신, 분할 키는 다음을 사용하여 명시적으로 제공되어야 합니다. WITH 다음과 같은 조항:

var partitionKey = event.value.keyProperty
EXECUTE privateProc() WITH partitionKey = partitionKey

이 예에서 우리는 현재 이벤트에서 값을 추출하고 그것을 사용하여 프로시저 실행을 적절한 파티션으로 라우팅합니다(사용할 적절한 값은 당연히 애플리케이션에 따라 다릅니다).

원격 호출

EXECUTE 표준을 통한 원격 호출을 지원합니다. PROCESSED BY 절.

RETURN

중요 참고 사항 – 대부분의 언어에서 RETURN 문장(또는 그에 상응하는 문장)은 제어 흐름을 변경하고 실행을 즉시 종료합니다. 이는 지원 VAIL에서는 사실입니다(자세한 내용은 아래를 참조하세요).

VAIL 프로시저는 실행이 완료되면 값을 반환합니다(이것은 실행 여부와 관계없이 참입니다. 리턴 타입 선언됨). 기본적으로 반환 값은 마지막으로 실행된 VAIL 문에서 생성된 값입니다. 이는 모든 VAIL 문이 VAIL 진술서 정의된 결과 값을 갖습니다. 반환 값을 더 명확하게 만들기 위해 RETURN 반환된 값을 지정하는 데 명령문을 사용할 수 있습니다. 구문은 다음과 같습니다.

return <valueExpression>

The RETURN 성명서 MUST 프로시저 본문의 마지막 문장이 됩니다. RETURN 성명서   프로시저 본문에서 더 일찍 프로시저 실행을 종료하는 데 사용할 수 있습니다. 예를 들어, 이는 합법적인 사용입니다. RETURN:

procedure addProperty(obj Object, propName String, value String): Boolean
var propertyAdded = false
if (!obj.has(propName)) {
    obj[propName] = value
    propertyAdded = true
}
return propertyAdded

절차가 반환됩니다 true 해당 속성이 객체에 추가된 경우 false 그렇지 않았다면.

하지만 이는 불법적인 사용입니다.

procedure addProperty(obj Object, propName String, value String): Boolean
if (obj.has(propName)) {
    return false // This is ILLEGAL!!  The code will keep running past this point.
}
obj[propName] = value
return true

이 절차는 항상 객체의 속성을 설정하고 항상 반환합니다. true.

이벤트 발송

The PUBLISH 명령문을 사용하면 사용자가 지정된 주제에 이벤트를 게시하거나 지정된 소스에 메시지를 전달할 수 있습니다. 명령문의 일반 구문은 다음과 같습니다. PUBLISH 문은 다음과 같습니다.

PUBLISH <message> TO [TOPIC <topic> [SCHEDULE <schedule>] | 
                      SERVICE EVENT <eventTypeRef> | 
                      SOURCE <source> [USING <config>]]
[<processedByClause>]

주제를 통해 보내기

사용자 정의 이벤트를 전송하기 위한 구문 화제 입니다

PUBLISH <eventData> TO TOPIC <topic> [SCHEDULE <schedule>]

The eventData 이벤트에 첨부된 데이터가 되는 결과를 갖는 표현식입니다(이벤트의 value 재산).  topic 다음 중 하나여야 합니다. String 문자 또는 변수 참조 대상의 이름을 포함하는 화제. 예를 들면 :

var topicName = "/myTopic/subtopic/new"
PUBLISH { name: "granite" } TO TOPIC @topicName

예정된 이벤트

The PUBLISH 문장을 사용하여 다음을 생성할 수 있습니다. 예정된 이벤트 를 통해 전달됩니다 화제 미래의 특정 시점(그리고 주기적으로 재전송될 수 있음). 이는 선택 사항을 추가하여 수행됩니다. SCHEDULE 조항에 PUBLISH 진술. 예를 들어:

PUBLISH { name: "granite" } TO TOPIC "/myTopic/subtopic/new" SCHEDULE {interval: 1 minute}

이 명령문은 이전 예제의 이벤트를 게시하지만, 즉시 이벤트를 게시하는 대신 명령문이 실행된 후 1분 후에 이벤트가 전달됩니다. schedule 인수는 다음을 생성하는 표현식이어야 합니다. Object. 이것은 될 수 있습니다 Object 문자 (위에 표시된 대로) 또는 변수 참조나 프로시저 호출과 같은 다른 표현식일 수 있습니다. 일정의 속성 Object 이벤트를 일회성으로 진행할지, 주기적으로 진행할지에 따라 달라집니다.

  • 일회성 배달: 객체는 다음 중 하나를 가져야 합니다. 간격 or 발생하다 부동산(둘 다 아님)으로 표시될 수도 있습니다. "일시적"으로 표시될 수도 있습니다.
    • 간격 – 시스템이 이벤트를 게시할 때까지 기다려야 하는 시간을 지정합니다. 값은 밀리초 단위입니다(따라서 간격 리터럴 (예시에서 보여준 대로).
    • occurAt – 다음을 지정합니다. DateTime 가치 이벤트가 게시되어야 하는 시점입니다. 제공된 값이 과거이면 이벤트가 즉시 전달됩니다.
    • isTransient – ​​if true 그러면 이벤트가 메모리에만 저장됩니다. 이 방법은 더 효율적이지만, 이벤트가 5분 이내에만 발생하도록 제한됩니다.
  • 정기 배송: 예상되는 속성은 다음과 같습니다.
    • name - 이벤트 이름입니다. 필수입니다. 이미 존재하는 이벤트를 참조하는 경우 나머지 속성으로 이벤트가 업데이트됩니다.
    • 주기적 – a Boolean 설정해야 하는 값 true.
    • interval – 이벤트가 반복적으로 게시되는 사이에 대기할 시간입니다. 이 속성은 필수이며 밀리초 수를 지정해야 합니다(따라서 간격 리터럴).
    • occurAt – 다음을 지정합니다. DateTime 이벤트가 게시되어야 하는 시점의 값입니다. 이 속성은 선택 사항입니다. 지정하지 않으면 이벤트의 최초 전송은 간격을 기준으로 합니다. 지정된 값이 과거이면 이벤트는 즉시 전송되고, 다음 전송은 지정된 간격과 일치하는 미래의 첫 번째 시점이 됩니다. 예를 들어, 값이 과거 7분이고 간격이 5분이면 이벤트는 즉시 전송되고 3분 후(즉, 해당 값에 10분을 더한 시간, 즉 2개의 간격)에 전송되도록 예약됩니다.

이전 예제에서는 일회성 이벤트를 생성하는 방법을 보여줬고, 여기서는 주기적 이벤트를 생성합니다.

PUBLISH { name: "granite" } TO TOPIC "/myTopic/subtopic/new" 
SCHEDULE {name: "graniteEvent", periodic: true, interval: 5 minutes}

이 이벤트는 요청 후 5분 후에 처음 전달되며, 삭제될 때까지 5분마다 반복됩니다.

한 번 생성되면 PUBLISH 예약된 이벤트는 리소스 인스턴스로 저장되며, 리소스 인스턴스처럼 조작할 수 있습니다. 예를 들어, 이전에 생성된 이벤트를 삭제하려면 다음을 사용합니다.

DELETE system.scheduledevents WHERE name == "graniteEvent"

일회성 이벤트는 전달 후 자동으로 삭제됩니다. 정기 이벤트는 발생하다 속성은 전달될 때마다 업데이트되어 다음 전달 시점을 반영합니다. 이 두 작업은 모두 비동기적으로 수행되므로 이벤트가 실제로 처리되기 전에는 발생하지 않았을 수 있습니다.

서비스로 보내기

사용자 정의 이벤트를 전송하기 위한 구문 서비스 이벤트 유형은 다음과 같습니다.

PUBLISH <eventData> TO SERVICE EVENT <eventTypeRef>

The eventData 이벤트에 첨부된 데이터가 되는 결과를 갖는 표현식입니다(이벤트의 value 재산).  eventTypeRef 다음 중 하나여야 합니다. String 문자 또는 변수 참조 서비스 이벤트 유형에 대한 참조를 포함합니다. 서비스 이벤트 유형 참조는 다음 형식입니다. <serviceName>/<eventTypeName>.

예 :

var eventType = "PipelineMonitor/recordData"
PUBLISH { segmentId: "123", pressure: 50.0 } TO SERVICE EVENT @eventType

참조된 서비스 이벤트 유형 해야합니다 인바운드.

외부 시스템으로 보내기

이벤트는 Vantiq에서 외부 시스템으로 다음을 통해 전송될 수 있습니다.  . 소스에 메시지를 게시하는 구문은 다음과 같습니다.

PUBLISH <sendRequest> TO SOURCE <source> USING <configuration>

The sendRequest 는 다음을 생성하는 표현식입니다. Object 값. 값의 속성은 소스에 따라 달라지며 다음에서 찾을 수 있습니다. 외부 소스 참조 가이드. 그만큼 source 다음 중 하나여야 합니다. 식별자 또는 변수 참조 대상의 이름을 포함하는  . 그만큼 configuration USING 절에는 다음을 생성하는 표현식이 있습니다. Object 값. 이 값의 속성은 다음 값의 속성과 병합됩니다. sendRequest 소스에 최종 요청을 제출합니다.

다음은 "메시지"를 보내는 예입니다. MQTT 소스:

PUBLISH {
    message: { 
        id: Device.id, 
        condition: "The device is no longer operating within allowed tolerances." 
    }
} TO SOURCE mqttSource USING { topic: "/myTopics/device/outOfRange" }

원격 호출

PUBLISH 표준을 통한 원격 호출을 지원합니다. PROCESSED BY 절.

데이터 조작

VAIL은 애플리케이션에 액세스하는 데 사용되는 여러 SQL 유사 작업을 제공합니다. 지속적 상태   외부 상태. 예외를 제외하고 UPSERT 성명서이들 각각은 진술문으로 사용될 수도 있고 표현의 일부로 사용될 수도 있습니다.

SELECT

The SELECT 작업은 지정된 대로 애플리케이션의 영구 상태 또는 외부 상태에서 데이터를 검색합니다. 다음 구문은 다음과 같습니다. SELECT 입니다

SELECT [SEQUENCE | ARRAY | [EXACTLY] ONE] [* | <propertyBinding> [, <propertyBinding>]*] 
FROM [SOURCE ] <target> [WITH <options>]
[WHERE <queryCondition>]
[GROUP BY <prop1> [, <propN>]*]
[ORDER BY <prop1> [ASC | DESC] [, <propN> [ASC | DESC]]*]
[<processedByClause> | <processingBlock> ]

processingBlock := [UNTIL <expression>] {
    <VAIL Statement>*
}

예를 들어, 트리거 이벤트에는 규칙 처리에 사용할 제품 이름에 매핑해야 하는 제품 ID가 포함될 수 있습니다. SELECT 연산을 사용하면 제품 유형에서 제품 이름을 얻을 수 있습니다.

var product = SELECT EXACTLY ONE name FROM Product 
    WHERE productId == event.newValue.productId
var name = product.name

여기 SELECT 변수 선언문의 오른쪽에 사용됩니다.

쿼리 결과

기본 쿼리 결과는 컨텍스트에 따라 결정됩니다. SELECT 진술. 대부분의 경우 결과는 다음과 같습니다. Array. 그러나, 목표로 사용될 경우 위한MAP및 FILTER 성명서, SELECT 를 반환 SequenceSELECT 또한 생산 Sequence 만약 그것이 바로 다음에 오는 경우 처리 블록 (및 선택적 종료 조건).

이러한 기본값은 결과 유형을 명시적으로 선언하여 변경할 수 있습니다. SELECT 다음 중 하나로 진술:

  • 시퀀스 - SELECT 생산 Sequence 일치하는 모든 결과를 포함합니다. 쿼리 조건.
  • 배열 – SELECT 생산 Array 결과의. 기본적으로 Array 최대 1000개의 객체로 제한됩니다. 이 크기는 다음을 사용하여 최대 10,000개까지 늘릴 수 있습니다. 제한 쿼리 옵션.
  • 하나 - SELECT 단일 결과를 생성하거나 결과를 생성하지 않습니다. 쿼리가 두 개 이상의 결과를 생성하는 경우 예외가 발생합니다. EXACTLY 수정자가 포함되면 SELECT 결과가 반환되지 않으면 예외가 발생합니다.

속성 바인딩

속성 바인딩(propertyBindings)는 VAIL 표현식을 사용하여 대상의 어떤 속성을 검색할지 또는 속성을 계산할 방법을 지정하는 데 사용됩니다. 속성 바인딩의 전체 구문은 다음과 같습니다.

<propertyName> [= <propertyExpression>]

The propertyExpression 두 가지 예외가 있는 표준 VAIL 표현식입니다.

예를 들어, 다음 쿼리:

SELECT name, total = quantity * price FROM LineItem

선택 name 에서 재산 라인항목 리소스 유형 및 속성을 계산합니다. 합계 곱하여    가격 속성.

집계 절차

를 정의하는 표현식 속성 바인딩 다음 집계 절차를 포함할 수 있습니다. 다음과 함께 사용할 경우 GROUP BY 절에서 시스템은 각 고유 그룹 키에 대해 하나의 값을 계산합니다. 그렇지 않으면 전체에 대해 단일 집계 값을 계산합니다. SELECT 결과.

  • 세다(속성 이름) – 문서 수를 계산합니다. 선택 사항인 경우 속성 이름 인수가 제공되면 해당 속성에 대해 null이 아닌 값을 가진 문서만 계산됩니다.
  • 합집합(속성 이름) – 값의 합을 계산합니다. 속성 이름 각 문서에서. 속성 값은 null이 아니고 숫자여야 합니다. 그렇지 않으면 오류가 발생합니다.
  • 평균(속성 이름) – 값의 평균을 계산합니다. 속성 이름 각 문서에서. 속성 값은 null이 아니고 숫자여야 합니다. 그렇지 않으면 오류가 발생합니다.
  • 첫 번째(속성 이름) – 첫 번째 값을 기록합니다. 속성 이름 결과 집합에서 볼 수 있습니다. 다음과 결합하면 가장 유용합니다. 주문.
  • 마지막(속성 이름) – 마지막 값을 기록합니다. 속성 이름 결과 집합에서 볼 수 있습니다. 다음과 결합하면 가장 유용합니다. 주문.
  • 분(속성 이름) – 값의 최소값을 계산합니다. 속성 이름 결과 집합에서. 속성 값은 어떤 식으로든 비교 가능해야 합니다.
  • 최대(속성 이름) – 최대값을 계산합니다. 속성 이름 결과 집합에서. 속성 값은 어떤 식으로든 비교 가능해야 합니다.

외부 관리 유형 및 속성 표현식

Vantiq 시스템의 유형이 다음을 통해 관리되는 외부 데이터를 참조하는 경우 스토리지 관리자VAIL은 속성 표현식을 스토리지 관리자에 푸시하여 평가를 수행함으로써 데이터 저장소별 기능에 액세스할 수 있도록 합니다. 이 경우 속성 표현식은 기본 데이터 관리 시스템이 처리할 수 있는 모든 표준 VAIL 표현식이 될 수 있습니다. 예를 들어 애플리케이션은 외부 시스템에서 사용 가능한 모든 집계 함수를 활용하여 위 목록을 훨씬 넘어서는 집계 기능 범위를 확장할 수 있습니다. Vantiq 시스템은 모든 속성 바인딩 표현식도 푸시합니다. 외부 시스템이 처리할 수 없는 경우 sumavgminmax, 등이 있는 경우 연관된 유형과 함께 해당 집계 프로시저를 사용하려고 하면 오류가 발생합니다.

목표

The 목표 식별 리소스 유형 or   에 정의 애플리케이션의 데이터 모델 에 SELECT 적용됩니다. 목표 선택적으로 포함 WITH 유형 또는 소스에 액세스하는 데 필요한 구성 정보가 포함된 절입니다. 일반 구문은 다음과 같습니다. 목표 입니다

FROM [SOURCE] <name> [AS <alias>] [WITH <options>]

The name 다음 중 하나여야 합니다. 식별자 또는 변수 참조 대상 유형 또는 소스의 이름을 포함합니다. alias 기본 결과 바인딩을 재정의하는 데 사용할 수 있습니다. with 절은 쿼리 실행을 수정하는 데 사용되는 추가 옵션을 제공합니다.

유형과 소스에 대한 자세한 구문은 아래와 같습니다.

리소스 유형에서 선택

공연하기 SELECT 리소스 유형에 대해 제공된 것과 일치하는 리소스 인스턴스를 반환합니다. 쿼리 조건. 쿼리 결과는 다음 중 하나입니다. 수집 of Object 값 또는 단일 Object 요청한 대로 값을 지정합니다.

기본적으로 결과는 리소스 유형과 동일한 이름을 가진 변수에 바인딩됩니다. 예를 들어, 다음에서 SELECT 성명서:

SELECT FROM Sensor

결과는 변수에 바인딩됩니다. 감지기리소스 유형 이름에 점(.) 그러면 마지막 점 뒤에 있는 이름 부분을 대신 사용합니다. 이 예에서는:

SELECT FROM com.vantiq.Sensor

결과는 또한 변수에 바인딩됩니다. 감지기별칭을 사용하면 이 기본 바인딩을 변경할 수 있습니다. 예:

SELECT FROM Sensor AS s

결과를 변수에 바인딩합니다. s.

두 가지 옵션을 지정할 수 있습니다. WITH 리소스 유형에서 선택할 때의 절:

  • 제한 – 반환할 최대 객체 수를 선언합니다. SELECT. 경우 SELECT 이상을 생산합니다 최대 행, 첫 번째만 최대 행이 반환됩니다.
  • 버킷 – 원인이 됩니다 SELECT 첫 번째를 폐기하라는 요청 계산 에 의해 반환된 객체 SELECT 그리고 객체에서 시작하여 행을 반환하기 시작합니다. 계산 + 1.

The LIMIT   SKIP 옵션은 쿼리 결과를 "페이지화"하는 데 매우 편리합니다. 예를 들어, 한 번에 20개의 리소스 인스턴스를 검색하려면 다음을 설정합니다. LIMIT=20   SKIP=0 처음 20개의 인스턴스를 검색합니다. 21번부터 40번까지의 인스턴스를 받으려면 다음을 설정합니다. LIMIT=20   SKIP=20; 인스턴스 41~60 설정 LIMIT=20   SKIP=40.

소스에서 선택

SELECT 외부 소스의 데이터 모델을 쿼리하려면 다음을 추가할 수 있습니다. SOURCE 수정자. 이로 인해 목표 쿼리할 소스의 이름으로 해석됩니다. WITH 옵션은 제공하는 데 사용됩니다 소스 구현 특정 설정. 예를 들어,

SELECT FROM SOURCE sampleRestSource WITH PATH = "/myResource"

여기서 우리는 다음을 쿼리하고 있습니다. 원격 소스 그리고 요청 설정 PATH 에 "/myResource.

소스에서 반환된 모든 데이터는 먼저 소스 구성에 따라 처리된 다음 지정된 대로 포맷됩니다. SELECT 조작예를 들어 JSON 데이터를 생성하는 소스가 있고 해당 소스에 대한 주어진 쿼리가 JSON 배열을 생성하는 경우 시스템은 먼저 JSON을 역직렬화하여 다음을 생성합니다. 배열. 그러면 시스템은 요청된 결과 유형에 따라 다음과 같이 배열의 형식을 지정합니다.

  • ARRAY – 결과는 다음에 배치됩니다. Array 예. 이 경우 결과는 다음과 같습니다. Array 또한 단일 요소로 구성된 Array (그것이 소스에서 생성된 내용이기 때문입니다).
  • SEQUENCE – 결과는 다음과 같습니다. Sequence 포함 Array 출처에 의해 생성됨.
  • ONE – 결과는 다음과 같습니다. Array 출처에 의해 생성됨.

소스 결과는 다음 중 하나를 사용하여 처리하는 것이 좋습니다. SEQUENCE or ONE.

SELECT 스토리지 관리자가 관리하는 유형에 대해 실행될 수 있습니다. 이 경우 스토리지 관리자가 트랜잭션을 지원하는 경우 WITH 절을 사용하여 진행 중인 트랜잭션 ID 값을 지정할 수 있습니다. 예:

SELECT FROM Sensor WITH transaction = <transaction ID value>

Vantiq 시스템은 기본 스토리지 관리자와 협력하여 지정된 트랜잭션의 컨텍스트에서 SELECT가 실행되도록 보장합니다. 스토리지 관리자 거래 

WHERE 절

The WHERE 절은 다음과 같은 경우에만 사용할 수 있습니다. 목표 의 SELECT 리소스 유형입니다.

The WHERE 절은 다음을 제공하는 데 사용됩니다. Boolean 대상 리소스 유형의 모든 인스턴스에 대해 평가되는 표현식("쿼리 조건"이라고 함). 표현식이 다음과 같이 평가되는 인스턴스만 true 결과에 포함될 것입니다 SELECT 작동.

쿼리 조건은 SQL과 유사한 구조를 가지므로 대부분의 데이터베이스 사용자에게 익숙합니다. 쿼리 조건은 하나 이상의 비교 절로 구성되며, 각 절은 다음 구문으로 연결됩니다. 논리 연산자 AND   OR (이것들은 동의어입니다. &&   || 두 구문 모두 사용할 수 있습니다. 구문은 다음과 같습니다.

<propertyReference> <comparisonOperator> <constantValue>

속성 참조

The propertyReference 단일이거나 식별자 또는 다음을 사용하여 중첩된 속성에 대한 참조 속성 참조 연산자. 참조는 각 리소스 인스턴스에 적용되어 비교에 사용되는 값을 얻습니다.

비교 연산자

다음과 같은 비교 연산자가 지원됩니다.

운영자 기술설명 예시
== 정확히 일치 prop == 42
!= 일치하지 않는다 prop != 42
> 보다 큰 prop > 42
>= 이상인 prop >= 42
< 이하 prop < 42
<= 보다 작거나 같음 prop <= 42
in 값 목록에 있어야 합니다 prop in ["paul", "fred", "melanie", "susan"]
않습니다.1 단항 부정 NOT (prop in ["paul", "fred", "melanie", "susan"])
!1 단항 부정 !(prop == 42 AND prop2 < 5)
정규식2 정규 표현식 패턴과 일치해야 합니다 prop regex "^p\w*"
지오니어4 주어진 거리 내에 있어야 합니다 GeoJSON 가치 아래 참조
지오교차점4 주어진 것과 교차해야 합니다 GeoJSON 가치 아래 참조
지오위딘4 주어진 범위 내에 포함되어야 합니다 GeoJSON 가치 아래 참조
  1. 부정되는 쿼리 조건은 괄호로 묶어야 합니다.
  2. 대상 속성은 다음을 보유해야 합니다. String.
  3. 둘 다에 적용 가능 String or Array 값. 적용 시 String 모든 공백은 무시됩니다.
  4. 대상 속성은 다음을 보유해야 합니다. GeoJSON 가치. 운영자는 (선택적으로) 제공된 고도를 무시합니다.

부정을 포함하는 모든 쿼리 조건은 대상 속성이 설정되지 않은 인스턴스와 일치합니다. 선택적 속성을 쿼리할 때는 다음 하위 절을 추가하는 것이 유용할 수 있습니다. AND prop != null예를 들어, 쿼리 조건은 다음과 같습니다.

NOT (prop in ["paul", "fred", "melanie", "susan"]) AND prop != null

모든 인스턴스를 무시합니다. prop is null 또는 설정되지 않음.

상수 값

The constantValue 모든 문자적 값이 될 수 있습니다 VAIL 유형고유한 JSON 표현을 가진 유형은 모든 쿼리 조건에서 해당 형식을 사용할 수 있습니다. 시스템은 또한 필요한 모든 작업을 수행합니다. 유형 변환.

예제 쿼리

다음은 몇 가지 예제 쿼리 조건입니다. 첫 번째 예제에서는 다음을 수행한다고 가정합니다. SELECT 속성이 있는 리소스 유형에 대해 무게 (kg) 유형글렌데일 위치.

weight >= 5000

무게가 5000kg 이상인 인스턴스를 선택합니다.

type == "truck"

트럭으로 식별된 인스턴스를 선택합니다.

type == "truck" and weight >= 5000

무게가 최소 5000kg인 트럭을 인스턴스로 선택합니다.

not (type == "truck") and weight >= 5000

트럭이 아니고 무게가 최소 5000kg인 인스턴스를 선택합니다.

location geoNear { 
    "$geometry": { 
        type: "Point", 
        coordinates: [ 90.834, 34.1987 ] 
    }, 
    "$minDistance": 100, 
    "$maxDistance": 1000 
}

지정된 "지점"으로부터 100단위 이상, 1000단위 이하 떨어진 인스턴스를 선택합니다.

location geoWithin {
    "$geometry": {
        type: "polygon",
        coordinates: [[ [0, 0], [0, 10], [10, 10], [10, 0], [0, 0] ]]
    }
}

주어진 "다각형"으로 지정된 영역 내부의 어딘가에 있는 인스턴스를 선택합니다.

GROUP BY

The GROUP BY 절은 다음과 같은 경우에만 사용할 수 있습니다. 목표 의 SELECT 리소스 유형입니다.

The GROUP BY 절은 지정된 속성에 대해 동일한 값을 갖는 인스턴스 집합에 대한 select 결과를 집계하는 데 사용됩니다. 예:

SELECT customerId, count=count() FROM Order GROUP BY customerId

"customerId"의 각 고유 값에 대한 주문 수를 선택합니다. GROUP BY 절이 없으면 시스템은 선택된 모든 인스턴스에 대한 집계 함수에 대한 단일 값을 생성합니다.

주문

The ORDER BY 절은 다음과 같은 경우에만 사용할 수 있습니다. 목표 의 SELECT 리소스 유형입니다.

The ORDER BY 절은 결과를 정렬하는 데 사용됩니다. SELECT.

SELECT * FROM <type> WHERE <constraint> ORDER BY <prop1> [ASC | DESC], ...

결과는 ORDER BY 절에 지정된 속성을 기준으로 정렬됩니다. 각 속성의 정렬 순서는 ASC 수정자를 사용하여 오름차순으로 지정하거나 DESC 수정자를 사용하여 내림차순으로 지정합니다. 기본 정렬은 오름차순입니다. 다음 유형의 속성을 포함합니다. 할 수 없습니다 ~에 의해 참조되다 ORDER BY 절: DecimalCurrencyResourceReferenceObject글렌데일 Array.

처리 결과

결과를 즉시 처리하려면 SELECT 다음에 올 수 있습니다 처리 블록. 이것은 목록입니다 VAIL 진술서 각 요소에 대해 한 번씩 실행됩니다. 순서 제작자 SELECT 문장. 처리 블록은 선택 사항으로 진행될 수 있습니다. UNTIL 시퀀스가 평가될 경우 시퀀스를 종료하는 절 true 주어진 요소에 대해서.

원격 호출

SELECT 표준을 통한 원격 호출을 지원합니다. PROCESSED BY 절.

INSERT

The INSERT 작업은 지정된 리소스 유형의 새 인스턴스를 삽입합니다. 구문은 다음과 같습니다.

INSERT [INTO] <typeName>(<valueSet>) [WITH <options>]
[<processedByClause>]

The typeName 다음 중 하나여야 합니다. 식별자 또는 변수 참조 대상 리소스 유형의 이름을 포함합니다.

The valueSet 아마도:

  • 목록 이름, 값 다음 형태의 쌍: <propertyName>: <value>.
  • An Object 문자.
  • 변수에는 다음이 포함됩니다. Object or Array 값.

예를 들면 다음과 같습니다.

INSERT Customer(name: "aCustomerName", address: "1400 Main St, SomeCity AK")

이름과 주소로 구성된 고객을 삽입합니다. 빠른  유형.

SQL에 더 익숙한 사람들을 위해 대체 구문을 사용할 수 있습니다.

INSERT INTO Customer(name = "aCustomerName", address = "1400 Main St, SomeCity AK")

삽입할 객체를 포함하는 변수를 사용하는 동일한 예:

var customer = { name: "aCustomerName", address: "1400 Main St, SomeCity AK" }
INSERT Customer(customer)

INSERT 스토리지 관리자가 관리하는 유형에 대해 실행될 수 있습니다. 이 경우 스토리지 관리자가 트랜잭션을 지원하는 경우 WITH 절은 진행 중인 트랜잭션의 트랜잭션 ID 값을 지정하는 데 사용할 수 있습니다. 예:

INSERT Customer(name: "customerName", address: "1400 Main St., SomeCity AK") WITH transaction = <transaction ID value>

Vantiq 시스템은 기본 스토리지 관리자와 함께 지정된 트랜잭션 컨텍스트에서 삽입이 실행되도록 보장합니다. 스토리지 관리자 거래 

대량 삽입

INSERT 요청당 두 개 이상의 객체 처리(일명 "대량 삽입")를 지원합니다. 이는 바인딩된 변수를 지정하여 수행됩니다. Array 값. 요소 Array 해야합니다 Object 값. 각각은 리소스 인스턴스로 독립적으로 처리되며 고유한 값을 생성합니다. 유형 이벤트.  예외 처리 과정에서 일부 사례는 처리되고 다른 사례는 무시될 수 있습니다.

원격 호출

INSERT 표준을 통한 원격 호출을 지원합니다. PROCESSED BY 절.

UPDATE

The UPDATE 작업은 지정된 리소스 유형의 지정된 인스턴스를 업데이트합니다. 구문은 다음과 같습니다.

UPDATE <typeName>(<valueSet>) [WITH <options>] WHERE <queryCondition>
[<processedByClause> | <errorHandler> ]

errorHandler := ON ERROR(<errorVariable>) {
    <VAIL Statement>*
}

The typeName 다음 중 하나여야 합니다. 식별자 또는 변수 참조 대상 리소스 유형의 이름을 포함합니다.

The valueSet 아마도:

  • 목록 이름, 값 다음 형태의 쌍: <propertyName>: <value>.
  • An Object 문자.
  • 변수에는 다음이 포함됩니다. Object 값.

시스템 속성 포함 ars_버전 인간을 valueSet 낙관적 동시성 제어(OCC)를 사용하여 관리합니다. 동시 업데이트.

The WHERE 절 이전에 설명한 것과 동일한 형식을 따릅니다. SELECT.

예를 들어, Customer 유형에서 찾은 기존 고객의 이름을 업데이트하려면 다음을 수행합니다.

UPDATE Customer(name: "newCustomerName") WHERE name == "aCustomerName"

이름이 "aCustomerName"인 기존 고객에게 새 이름인 "newCustomerName"이 지정됩니다.

업데이트할 객체를 포함하는 변수를 사용하는 동일한 예:

var customerUpdate = { name: "newCustomerName" }
UPDATE Customer(customerUpdate) WHERE name == "aCustomerName"

UPDATE 스토리지 관리자가 관리하는 유형에 대해 실행될 수 있습니다. 이 경우 스토리지 관리자가 트랜잭션을 지원하는 경우 WITH 절은 진행 중인 트랜잭션의 트랜잭션 ID 값을 지정하는 데 사용할 수 있습니다. 예:

UPDATE Customer(address: "11 Main St.") WITH transaction = <transaction ID value> WHERE name == "aCustomerName" 

Vantiq 시스템은 기본 스토리지 관리자와 협력하여 지정된 트랜잭션 컨텍스트에서 업데이트가 실행되도록 보장합니다. 스토리지 관리자 거래 

인스턴스 쿼리를 통한 업데이트

경우 WHERE 절은 다음을 지정합니다. 리소스 ID (그리고 대상의 리소스 ID만) 리소스 유형, 이를 "인스턴스 쿼리"라고 합니다. 인스턴스 쿼리를 사용하면 UPDATE 영향을 미쳐야 한다 정확하게 하나의 인스턴스. 일치하는 인스턴스가 발견되지 않으면 작업은 다음을 throw합니다. 예외. 다른 모든 경우에는 인스턴스가 발견되지 않으면 작업이 무시됩니다.

대량 업데이트

이전 예에서는 다음을 사용하는 방법을 보여줍니다. WHERE 단 하나의 인스턴스와 일치하는 절입니다. 업데이트를 수행하는 것도 가능합니다. WHERE 절은 두 개 이상의 인스턴스와 일치합니다(일명 "대량" 업데이트). 이 경우 업데이트는 일치하는 모든 인스턴스에 적용됩니다. 없이 개별적으로 직접 접근해야 합니다. 대량 UPDATE 작업은 단일을 생성합니다 유형 이벤트 완료되면.

업데이트 오류 처리

The UPDATE 작업은 다음을 지정할 수 있습니다. ON ERROR 처리 중 발생하는 오류를 처리하는 데 사용되는 블록입니다. 특히 다음을 수행할 때 유용합니다. 대량 업데이트 첫 번째 오류가 발생했을 때 작업을 종료하는 대신, 오류가 발생할 때마다 점진적으로 처리할 수 있기 때문입니다.

원격 호출

UPDATE 표준을 통한 원격 호출을 지원합니다. PROCESSED BY 절.

업서트

The UPSERT 명령문은 지정된 리소스 유형의 지정된 인스턴스에서 두 가지 기능 중 하나를 수행합니다.

  • 인스턴스가 현재 존재하지 않으면 유형에 삽입됩니다.
  • 인스턴스가 이미 존재하는 경우 지정된 값으로 업데이트됩니다.

UPSERT 문의 구문은 다음과 같습니다.

UPSERT <typeName>({<propertyName>: <value> [, <propertyName> : <value>]...}) [WITH <options>]
[<processedByClause>]

The typeName 다음 중 하나여야 합니다. 식별자 또는 변수 참조 대상 리소스 유형의 이름을 포함합니다. 지정된 리소스 유형 MUST 이 내추럴키 선언되었습니다. 지정된 인스턴스 UPSERT 조작 MUST 모든 속성에 대한 값을 포함합니다. 내추럴키.

The valueSet 아마도:

  • 목록 이름, 값 다음 형태의 쌍: <propertyName>: <value>.
  • An Object 문자.
  • 변수에는 다음이 포함됩니다. Object or Array 값.

예 :

UPSERT Customer(name: "customerName", address: "11 Main Street")

가정 빠른  선언했다 name 자연스러운 키로서 빠른  과 name 동일 customerName 존재하지 않습니다. 이 새로운 빠른  삽입됩니다. 그러나 빠른  인스턴스가 존재하는 경우 주소가 "11 Main Street"로 업데이트됩니다.

UPSERT 스토리지 관리자가 관리하는 유형에 대해 실행될 수 있습니다. 이 경우 스토리지 관리자가 트랜잭션을 지원하는 경우 WITH 절은 진행 중인 트랜잭션의 트랜잭션 ID 값을 지정하는 데 사용할 수 있습니다. 예:

UPSERT Customer(name: "customerName", address: "11 Main Street") WITH transaction = <transaction ID value>

Vantiq 시스템은 기본 스토리지 관리자와 협력하여 지정된 트랜잭션의 컨텍스트에서 업서트가 실행되도록 보장합니다. 스토리지 관리자 거래 

대량 UPSERT

UPSERT 요청당 두 개 이상의 객체 처리(일명 "대량 업서트")를 지원합니다. 이는 바인딩된 변수를 지정하여 수행됩니다. Array 값. 요소 Array 해야합니다 Object 값. 각각은 리소스 인스턴스로 독립적으로 처리되며 고유한 값을 생성합니다. 유형 이벤트.  예외 처리 과정에서 일부 사례는 처리되고 다른 사례는 무시될 수 있습니다.

원격 호출

UPSERT 표준을 통한 원격 호출을 지원합니다. PROCESSED BY 절.

삭제

The DELETE 작업은 지정된 리소스 유형의 지정된 인스턴스를 삭제합니다. 구문은 다음과 같습니다.

DELETE <typeName> [WITH <options>] WHERE <queryConstraint>
[<processedByClause>]

The typeName 다음 중 하나여야 합니다. 식별자 또는 변수 참조 대상 리소스 유형의 이름을 포함합니다.

The WHERE 절 이전에 설명한 것과 동일한 형식을 따릅니다. SELECT.

예를 들어, 업데이트된 고객을 삭제하려면 UPDATE 조작 예:

DELETE Customer WHERE name == "newCustomerName"

DELETE 스토리지 관리자가 관리하는 유형에 대해 실행될 수 있습니다. 이 경우 스토리지 관리자가 트랜잭션을 지원하는 경우 WITH 절은 진행 중인 트랜잭션의 트랜잭션 ID 값을 지정하는 데 사용할 수 있습니다. 예:

DELETE Customer WITH transaction = <transaction ID value> WHERE name == "newCustomerName"

Vantiq 시스템은 기본 스토리지 관리자와 협력하여 지정된 트랜잭션의 컨텍스트에서 삭제가 실행되도록 보장합니다. 스토리지 관리자 거래 

인스턴스 쿼리를 통한 DELETE

경우 WHERE 절은 대상의 리소스 ID(리소스 ID만)를 지정합니다. 리소스 유형, 이를 "인스턴스 쿼리"라고 합니다. 인스턴스 쿼리를 사용하면 DELETE 영향을 미쳐야 한다 정확하게 하나의 인스턴스. 일치하는 인스턴스가 발견되지 않으면 작업은 다음을 throw합니다. 예외. 다른 모든 경우에는 인스턴스가 발견되지 않으면 작업이 무시됩니다.

대량 삭제

이전 예에서는 다음을 사용하는 방법을 보여줍니다. WHERE 단 하나의 인스턴스와 일치하는 절입니다. 또한 다음을 수행할 수도 있습니다. DELETE 어디 WHERE 절은 두 개 이상의 인스턴스와 일치합니다(일명 "대량" 삭제). 이 경우 작업은 일치하는 모든 인스턴스를 삭제합니다. 없이 개별적으로 직접 접근해야 합니다. 대량 DELETE 작업은 단일을 생성합니다 유형 이벤트 완료되면.

원격 호출

DELETE 표준을 통한 원격 호출을 지원합니다. PROCESSED BY 절.

오류 처리

VAIL은 오류 및 기타 예외 이벤트를 처리하기 위해 예외를 사용합니다. 예외는 실행 중 발생하는 이벤트입니다. 지배 or 순서, 정상적인 처리 흐름을 방해합니다. 실행 중 오류가 발생하면 시스템은 오류 정보를 예외에 기록하고 즉시 해당 예외 처리를 시작합니다(이를 "예외 발생"이라고도 함). 예외는 Object 다음 속성을 가진 값:

  • 암호 - String 오류(및 관련 메시지 템플릿)를 식별하는 데 사용되는 값입니다. Vantiq에서 생성된 예외에 대한 "오류 코드"는 다음으로 시작합니다. io.vantiq (또한 다음과 같이 시작하는 일부 레거시 오류 코드도 있습니다. com.accessg2.ag2rs).
  • 메시지 - String 오류 메시지의 완전한 형식이 포함된 값입니다.
  • 매개 변수 – Array 완전히 형식화된 오류 메시지를 구성하는 데 사용된 대체 매개변수를 포함하는 값입니다. Array 모든 합법적인 VAIL 유형이 될 수 있습니다.
  • 형식화됨 - Boolean 메시지가 이미 포맷되었는지 여부를 나타내는 값입니다. 이는 주로 내부적으로 사용됩니다. 일반적으로 예외 이벤트에서 발생하는 모든 값은 isFormatted 로 설정 true. VAIL 코드가 예외 값을 수동으로 작성하는 경우 isFormatted 상태와 일치해야 합니다. message 속성. 만약 true 그 다음에 message 속성에는 완전히 형식화된 메시지가 포함되어야 합니다. false 그 다음에 message 속성에는 메시지 템플릿이 포함되어야 합니다(참조 Java MessageFormat 클래스)와 params 속성에는 대체 매개변수가 포함되어야 합니다. 생략 isFormatted 속성은 그것을 설정하는 것과 동일합니다 false.

예외가 발생하면 런타임 시스템은 이를 처리할 무언가를 찾으려고 시도합니다. 예외를 처리할 수 있는 "무언가"의 집합은 오류가 발생한 프로시저에 도달하기 위해 호출된 프로시저들의 순서 목록입니다. 이 프로시저 목록을 호출 스택규칙을 처리하는 경우, 규칙은 항상 이 스택의 맨 위에 위치합니다.

런타임 시스템은 호출 스택에서 예외를 처리할 수 있는 코드 블록을 검색합니다. 이 코드 블록을 오류 처리기검색은 오류가 발생한 프로시저부터 시작하여 프로시저가 호출된 순서의 역순으로 호출 스택을 탐색합니다. 적절한 처리기를 찾으면 런타임 시스템은 해당 처리기에 예외를 전달합니다. 다음과 같은 경우 처리기가 적절하다고 판단합니다.

  • 이는 다음에 의해 정의됩니다. CATCH 현재 활성화된 블록 TRY 성명서.
  • 이는 다음에 의해 정의됩니다. ON [REMOTE] ERROR 블록 원격 조작 그리고 해당 작업에서 예외가 발생했습니다.
  • 에 정의되어 있습니다. ON ERROR 블록 UPDATE 조작 그리고 해당 작업에서 예외가 발생했습니다.

호출 스택의 프로시저에서 처리되지 않는 예외는 해당 프로시저를 종료시킵니다(이 예외가 프로시저를 "탈출"했다고 합니다). 실행 중인 규칙에서 "탈출"되는 예외는 해당 규칙을 종료시킵니다. 규칙 또는개인 절차 예외로 인해 종료되면 시스템은 인스턴스를 생성합니다. ArsRuleSnapshot 리소스와 함께 항목 유형 속성이로 설정 됨 error.

응용 프로그램 오류

애플리케이션이 오류 조건을 감지하고 오류를 보고하고 현재 프로시저/규칙을 종료하려는 상황이 있을 수 있습니다. 이는 다음을 호출하여 수행됩니다. 내장 예외() 순서. 예를 들면 :

exception("my.exception.code", "My error message: {0}", ["help"])

전역 오류 처리

예외 발생 시 호출 스택에 있는 프로시저와 규칙은 오류에 대한 "로컬" 처리를 수행하며, 결과를 수정할 수도 있습니다. 하지만 때로는 더 전역적으로 발생하는 오류를 파악하는 것이 유용할 수 있습니다. 이는 생성을 처리하는 규칙을 생성하여 수행할 수 있습니다. ArsRuleSnapshot 이전에 언급된 인스턴스. 예를 들어, 다음 규칙은 오류 레코드가 생성될 때마다 실행됩니다.

RULE exceptionHandler
WHEN EVENT OCCURS ON "/types/ArsRuleSnapshot/insert"
<logic for handling exception>

이러한 규칙은 오류에 대한 정보를 기록하고 애플리케이션의 데이터 모델 상태를 변경할 수 있지만 예외의 로컬 처리에는 영향을 줄 수 없습니다.

로깅

VAIL은 시스템에서 제공하는 로깅 서비스를 통해 애플리케이션별 "로그" 메시지 생성을 지원합니다. 이 서비스에 대한 액세스는 모든 VAIL 실행 컨텍스트에서 암묵적으로 정의된 기록 변수(이 서비스에 접근할 수 있는 다른 방법이 없음).

로그 메시지는 특정 시점에 생성될 메시지를 제어하는 ​​"레벨"과 연결됩니다. 사용 가능한 로깅 레벨은 다음과 같습니다.

  • ERROR – 레벨 40
  • WARN – 레벨 30
  • INFO – 레벨 20
  • DEBUG – 레벨 10
  • TRACE – 레벨 0

이러한 레벨은 "순서화"되어 있어 "낮은" 레벨(더 낮은 연관 값을 갖는 레벨)을 활성화하면 모든 "높은" 레벨도 활성화됩니다. 따라서 DEBUG 레벨은 레벨을 발생시킵니다 INFOWARN   ERROR 또한 활성화되어야 합니다. 시스템의 기본 로깅 수준은 다음과 같습니다. INFO. 로깅 수준은 네임스페이스에 대해 전역적으로 설정할 수 있으며 개별 네임스페이스에 대해 특별히 설정할 수 있습니다. VAIL 리소스. 이것은 다음을 사용하여 수행됩니다. 디버그 구성 자원.

서비스의 인터페이스는 다음과 같습니다.

  • 오류(메시지, 인수) – 주어진 인수 배열을 사용하여 변수 대체를 먼저 수행한 후 주어진 메시지를 로깅합니다. 현재 로깅 구성에서 수준을 지정하는 경우에만 메시지가 로깅됩니다. ERROR 이하.
  • 경고(메시지, 인수) – 주어진 인수 배열을 사용하여 변수 대체를 먼저 수행한 후 주어진 메시지를 로깅합니다. 현재 로깅 구성에서 수준을 지정하는 경우에만 메시지가 로깅됩니다. WARN 이하.
  • info(메시지, 인수) – 주어진 인수 배열을 사용하여 변수 대체를 먼저 수행한 후 주어진 메시지를 로깅합니다. 현재 로깅 구성에서 수준을 지정하는 경우에만 메시지가 로깅됩니다. INFO 이하.
  • 디버그(메시지, 인수) – 주어진 인수 배열을 사용하여 변수 대체를 먼저 수행한 후 주어진 메시지를 로깅합니다. 현재 로깅 구성에서 수준을 지정하는 경우에만 메시지가 로깅됩니다. DEBUG 이하.
  • 추적(메시지, 인수) – 주어진 인수 배열을 사용하여 변수 대체를 먼저 수행한 후 주어진 메시지를 로깅합니다. 현재 로깅 구성에서 수준을 지정하는 경우에만 메시지가 로깅됩니다. TRACE.

위의 모든 경우에 메시지 포맷팅은 SLF4J를 사용하여 수행됩니다. 메시지포매터.

로그 메시지는 인스턴스로 저장됩니다. logs 리소스. 기록된 메시지는 Vantiq 리소스 API를 통해 사용할 수 있거나 다음을 통해 볼 수 있습니다. 반틱 IDE. 로그를 볼 때 로그 항목이 고유한 순서대로 먼저 정렬된다는 점을 알아두십시오. 호출 ID 규칙이나 프로시저의 각 실행과 관련된 다음 로그 항목에 할당된 타임스탬프를 기준으로 정렬됩니다.

예를 들어, 다음 규칙이 주어졌다고 가정해 보겠습니다.

RULE myRule
WHEN EVENT OCCURS ON "/types/myType/insert"
log.info("An insert occurred on myType!")

메시지 An insert occurred on myType! 로그 수준이 최소한으로 구성된 경우 기록됩니다. INFO.

로그 메시지는 다음 예와 같이 매개변수화될 수 있습니다.

RULE myRule
WHEN EVENT OCCURS ON "/types/myType/insert"
log.debug("This message contains p1: {} and p2: {}", ["first", "second"])

로그 수준이 DEBUG 이상으로 구성된 경우 '이 메시지에는 p1: 첫 번째와 p2: 두 번째가 포함되어 있습니다'라는 메시지가 기록됩니다. 메시지 시작 부분부터 각 중괄호 쌍('{}')은 로그 호출의 다음 매개변수로 대체됩니다.

때문에 INFO 기본 수준이므로 Vantiq에서는 개발 중 로그 항목을 생성하는 데 사용되는 모든 로그 문을 다음과 같이 작성할 것을 권장합니다. DEBUG or TRACE 그렇지 않으면 규칙이나 프로시저가 배포될 때 로그 명령문이 프로덕션 로그에 많은 양의 출력을 추가합니다. 이로 인해 프로덕션 로그 출력에서 ​​의도치 않은 개발 진단 메시지를 필터링하기가 더 어려워집니다.

리소스 정의

리소스 정의 문은 다음 Vantiq 리소스의 생성/업데이트/삭제를 지원합니다.

모든 진술에 대해 제시된 리소스 정의는 다음에 정의된 것과 같습니다. 리소스 참조 가이드. 대부분의 경우 이는 JSON 표현이지만 VAIL 리소스 정의는 일반 텍스트로 제공됩니다.

생성 및 변경

The CREATE   ALTER 명령문은 각 리소스의 새 인스턴스를 생성하거나 기존 인스턴스의 정의를 수정하는 기능을 지원합니다. Vantiq는 이러한 모든 리소스에 대해 자동 "upsert"를 구현합니다. 결과적으로, CREATE   ALTER 구문과 의미 모두 동일하며 유일한 차이점은 초기 키워드입니다.

아래 구문에서는 다음만 표시합니다. CREATE 키워드이지만 이것은 다음으로 대체될 수 있습니다. ALTER.

원격 호출

CREATE 표준을 통한 원격 호출을 지원합니다. PROCESSED BY 절.

규칙 만들기

의 인스턴스를 생성합니다. 규칙 자원.

CREATE RULE (<ruleDefiningText>) [WITH active = [true | false]]
[<processedByClause>]

The Boolean 활동적인 속성은 규칙의 초기 상태를 설정하기 위해 포함될 수 있습니다. true 값은 규칙이 활성화되었음을 선언합니다. false 값은 규칙을 비활성 상태로 선언합니다. 기본적으로 규칙은 생성되는 즉시 활성화됩니다.

절차 생성

의 인스턴스를 생성합니다. 절차 자원.

CREATE PROCEDURE (<procedureDefiningText>)
[<processedByClause>]

유형 생성

의 인스턴스를 생성합니다. 유형 자원.

CREATE TYPE (<typeDefiningObject>)
[<processedByClause>]

주제 만들기

의 인스턴스를 생성합니다. 주제 자원.

CREATE TOPIC (<topicDefiningObject>)
[<processedByClause>]

소스 생성

의 인스턴스를 생성합니다. 소스 자원.

CREATE SOURCE (<sourceDefiningObject>)
[<processedByClause>]

노드 생성

의 인스턴스를 생성합니다. 노드 자원.

CREATE NODE(<nodeDefiningObject>)
[<processedByClause>]

DROP

drop 문은 시스템에서 리소스 인스턴스를 제거하는 데 사용됩니다. 구체적인 명령문은 아래와 같습니다.

원격 호출

DROP 표준을 통한 원격 호출을 지원합니다. PROCESSED BY 절.

드롭 규칙

DROP RULE <ruleName>
[<processedByClause>]

드롭 소스

DROP SOURCE <sourceName>
[<processedByClause>]

드롭 유형

DROP TYPE <typeName>
[<processedByClause>]

주제 삭제

DROP TOPIC <topicName>
[<processedByClause>]

드롭 노드

DROP NODE <nodeName>
[<processedByClause>]

분산 처리

Vantiq는 VAIL 명령문의 분산 실행을 지원하며, 이를 통해 해당 명령문은 원격 Vantiq 서버 집합에서 실행됩니다. 분산 처리를 지원하는 명령문은 다음과 같습니다.

원격으로 호출되는 경우 이러한 작업은 MUST (다른 맥락에서도 사용될 수 있다고 가정하고) 진술문으로 사용할 수 있습니다.

원격 연결 정의

The 노드 리소스는 Vantiq 서버의 원격 설치에 대한 연결을 나타냅니다. 각 노드에는 대상 설치에 연결하는 데 사용되는 URI와 요청 인증에 사용되는 자격 증명이 포함되어 있습니다. 따라서 각 노드는 대상 설치에서 호스팅하는 특정 네임스페이스에 액세스할 수 있는 권한을 부여합니다. 원격으로 실행되는 모든 명령문은 노드의 자격 증명에 의해 부여된 권한을 사용하여 해당 네임스페이스에서 작동합니다.

처리됨 절

원격으로 실행 가능한 모든 문장은 다음을 지원합니다. PROCESSED BY 절은 명령문에 대한 모든 원격 처리를 설명합니다. 절의 위치는 지원되는 각 키워드의 구문 세부 정보에서 확인할 수 있습니다. 배치와 관계없이 PROCESSED BY 절은 다음 구문을 사용합니다.

[AS <resultVar>] PROCESSED BY [[EXACTLY | AT LEAST] ONE] (<queryConstraint> | ALL) 
[CONTEXT TO <contextVar>] 
[WITHIN <timeInterval>]
[UNTIL <terminatingCondition>] { 
    <statements>
}
[ON [REMOTE] ERROR (<errorVar>) {
    <statements>
}]

다음 예에서는 다음을 사용하는 방법을 보여줍니다. PROCESSED BY 과 INSERT 성명서:

INSERT MyType(name: "myName") AS result PROCESSED BY ars_properties.region == "West"
CONTEXT TO resultCtx {
    log.info("Inserted object with id {} on node {}", [result._id, resultCtx.node.name])
} ON REMOTE ERROR (errorCtx) {
    log.warn("Failed to insert on node {} due to error: {}", [errorCtx.node.name, errorCtx.error.message])
}

결과 변수

PROCESSED BY 결과를 보관하는 데 사용되는 변수를 정의할 수 있습니다. AS 절. 실행되는 명령문에 따라 이 절이 필요할 수도 있고 필요하지 않을 수도 있습니다. 예를 들어, SELECT 명령문은 결과에 대한 기본 변수 바인딩을 정의합니다. 이 바인딩은 명시적인 결과 변수가 정의되지 않은 경우 사용됩니다. 그러나 EXECUTE 해당 문장에는 그러한 기본값이 없으므로 다음을 의미합니다. AS 비 싱글톤 결과를 처리하려면 절이 필요합니다(참조 결과 처리 상세 사항은).

이 예제에서는 변수를 정의합니다. result 결과를 유지할 것입니다 INSERT 각 대상 노드에 대한 명령문.

원격 대상 선택

The queryConstraint 의 일부로 정의됨 PROCESSED BY 절은 다음을 선택합니다. 노드 명령문이 실행될 인스턴스입니다. queryConstraint 는 다음과 같은 형식의 논리적 표현입니다. WHERE 절 의 SELECT 성명서. 그만큼 queryConstraint 에 적용됩니다 노드 로컬 네임스페이스의 리소스입니다. 제약 조건을 충족하는 모든 인스턴스는 명령문을 실행하고 결과를 로컬 노드로 반환하는 데 사용됩니다. 쿼리 제약 조건은 키워드도 인식합니다. ALL 이렇게 하면 해당 명령문이 모든 원격 노드에서 실행됩니다.

이상적으로 제약 조건은 URI와 같은 물리적 특성이 아닌 대상 노드의 "논리적" 특성을 지정해야 합니다. 시스템은 다음을 정의했습니다. ars_properties 이런 종류의 정보를 보관하려면 속성을 사용할 수 있습니다.

이전 예에서, INSERT 모든 노드에서 실행됩니다. 지방 열쇠 ars_properties "서쪽"으로 설정되었습니다.

또 다른 대안은 다음을 활용하는 것입니다. 태그 값 UI에서 리소스 인스턴스 검색을 용이하게 하는 데 사용됩니다. 이러한 값은 Array 가치 ars_properties.태그 개별 요소로서(각 태그 값 앞에 접두사가 붙습니다) #). 따라서 "factoryNode" 태그가 있는 모든 노드를 타겟으로 지정하려면 다음과 같은 쿼리 제약 조건을 사용합니다.

ars_properties.tags == "#factoryNode"

노드 카디널리티 수정자

기본적으로 PROCESSED BY 쿼리 제약 조건과 일치하는 모든 노드(하나, 없음 또는 수십 개)에서 명령문을 실행합니다. 다음 노드 카디널리티 수정자를 사용하면 예상 대상 노드 수를 더욱 정확하게 제어할 수 있습니다.

  • ONE – 대상 노드의 컬렉션은 두 개 이상의 멤버를 가질 수 없습니다(하지만 0개는 있을 수 있음).
  • AT LEAST ONE – 대상 노드 컬렉션에는 최소한 하나의 멤버가 있어야 합니다(하지만 그 이상일 수도 있음).
  • EXACTLY ONE – 대상 노드 컬렉션에는 반드시 하나의 멤버만 있어야 합니다.

대상 노드 컬렉션의 크기가 지정된 제한에 맞지 않으면 시스템은 다음을 발생시킵니다. 예외.

지정된 기수를 적용하는 것 외에도 ONE   EXACTLY ONE 수정자는 또한 처리를 트리거합니다. 싱글톤 결과.

바운딩 요청 시간

The WITHIN 하위 절은 시스템이 원격 노드가 결과를 생성할 때까지 기다리는 시간을 제한하는 데 사용될 수 있습니다. timeInterval 로 지정됩니다 Integer 밀리초 수(일반적으로 사용) 간격 리터럴). 지정된 시간 내에 결과를 생성하지 않는 모든 노드는 대신 다음을 생성합니다. 예외 오류 코드와 함께 io.vantiq.federation.request.timeout.

처리 결과

기본적으로 다음을 통해 실행된 명령문의 결과는 다음과 같습니다. PROCESSED BY 로 반환됩니다 순서, 수정자가 아닌 한 ONE or EXACTLY ONE 사용됩니다. 이러한 수정자 중 하나가 있는 경우 결과는 다음과 같이 직접 반환됩니다. 싱글턴 값.

시퀀스 결과

이 형식에서 원격 명령문은 제공된 처리 블록에서 처리되는 일련의 결과를 생성합니다. 다음을 제외한 모든 명령문의 경우 SELECT, 시퀀스에는 명령문이 실행된 각 노드에 대한 하나의 결과가 포함됩니다. SELECT 모든 노드의 결과는 단일 시퀀스로 병합된 후 처리됩니다. 두 경우 모두 반환되는 결과의 순서는 비결정적입니다. CONTEXT TO 하위 조항 현재 결과를 생성한 노드에 대한 정보를 얻는 데 사용할 수 있습니다. 처리 블록에 다음이 포함되지 않는 한 시퀀스 처리는 소진될 때까지 계속됩니다. UNTIL 하위 조항.

까지

The UNTIL 하위 절은 처리 또는 오류 처리 블록의 각 호출 후에 평가되는 논리 표현식을 지정합니다. 표현식이 다음과 같이 평가되는 경우 true 그러면 시퀀스 처리가 즉시 종료됩니다. 다음을 참조하세요. FOR 성명서 예를 들어 UNTIL 처리.

컨텍스트

The CONTEXT TO 하위 절은 현재 처리 중인 시퀀스 항목에 대한 요청 상태를 보관할 변수를 지정하는 데 사용됩니다. 상태는 다음과 같습니다. Object 다음 속성을 가진 값:

  • 지위 - String 요청 상태를 나타내는 값입니다. "SUCCESS" 또는 "FAILURE" 중 하나이지만, 이 경우에는 항상 "SUCCESS"입니다.
  • 노드 – 인스턴스의 노드 의지 처리 중인 항목을 생성한 노드에 대해서.

예를 들어, 노드 "node3"의 상태는 다음과 같습니다.

    { 
        "node": { "name" : "node3", ... }, 
        "status": "SUCCESS",
    },

싱글턴 결과

특별한 형태가 존재하는 경우 PROCESSED BY 조항에는 다음이 포함됩니다. 노드 카디널리티 수정자 ONE or EXACTLY ONE이 경우 반환된 결과는 해당 명령문의 로컬 실행과 동일한 형식으로 지정됩니다. 예를 들어, 다음과 같은 경우 SELECT ONE 진술 :

var local = SELECT ONE * FROM procedures WHERE (query clause)
var remote = SELECT ONE * FROM procedures WHERE (query clause) PROCESSED BY EXACTLY ONE (node query clause)

호출 없이 PROCESSED BY 전에, SELECT ONE 문장은 단일을 반환합니다 Object 인스턴스가 쿼리 절과 일치하는 경우 값 또는 null 인스턴스가 일치하지 않으면. PROCESSED BY 사용 EXACTLY ONE 최대 하나의 대상 노드를 요구하려면 기본값을 생성하는 대신 반환 형식이 동일해야 합니다. 시퀀스 결과.

효과는 두 가지뿐입니다. PROCESSED BY 이 경우 결과 형식은 다음과 같습니다.

  • 잘못된 개수의 노드가 발견되면 여전히 예외가 발생합니다.
  • 사용시 PROCESSED BY ONE 특히, 다음과 같은 진술 SELECT 돌아올거야. null 쿼리 절과 일치하는 노드가 없는 경우. SELECT 이 경우에는 빈 배열을 반환합니다.

원격 오류 처리

요청 실행 및/또는 결과 시퀀스 생성 중 오류가 발생하면 해당 오류는 무시됩니다. ...을 제외하면 전에, PROCESSED BY 절에는 다음을 통해 정의된 오류 처리기가 포함됩니다. ON REMOTE ERROR 하위 절. 오류 처리기가 정의되면 해당 오류에 대해 호출되고 선언된 오류 변수에는 다음 속성을 가진 상태 객체가 채워집니다.

  • 지위 – 요청 상태입니다. "SUCCESS" 또는 "FAILURE" 중 하나이지만, 이 경우에는 항상 "FAILURE"입니다.
  • 노드 – 인스턴스의 노드 의지 오류가 발생한 노드에 대해서.
  • 오류 – 예외 오류를 설명합니다.

예를 들어, 인증 문제로 인해 실패한 "node3"에 대한 요청에 대한 오류 상태는 다음과 같습니다.

    { 
        "node": { "name" : "node3", ... }, 
        "status": "FAILURE",
        "error":  {
            "code": "io.vantiq.authentication.failed", 
            "message": "Supplied authentication information is invalid."
        }
    },

VAIL 내장 서비스 및 절차

유형별 절차

베일 표준 유형 다양한 시스템 정의(일명 "내장") 프로시저를 지원합니다. 별도로 명시되지 않는 한, 이러한 프로시저는 다음 중 하나를 사용하여 호출할 수 있습니다. 곧장 or 메서드 스타일 호출. 설명서에는 직접 호출에 사용되는 매개변수가 나열되어 있습니다.

문자열 프로시저

다음 내장 프로시저를 사용하면 편리하게 작동할 수 있습니다. String 값.

유형 변환 절차

다음 절차를 사용하여 명시적으로 변환을 수행할 수 있습니다. String 다른 사람에게 가치를 부여하다 표준형:

  • toInteger(str) – 변환하다 String 해당하는 Integer 가치. 예외가 발생합니다. 하위 버전 로 변환할 수 없습니다 Integer.
  • toReal(str) – 변환하다 String 해당하는 Real 가치. 예외가 발생합니다. 하위 버전 로 변환할 수 없습니다 Real.
  • toDecimal(str, scale) – 변환하다 String 해당하는 Decimal 가치. 예외가 발생합니다. 하위 버전 로 변환할 수 없습니다 Decimal 값. 매개변수 scale 선택 사항이며 지정하지 않으면 기본값은 0입니다.
  • toCurrency(str, scale) – 변환하다 String 해당하는 Currency 가치. 예외가 발생합니다. 하위 버전 로 변환할 수 없습니다 Currency 값. 매개변수 scale 선택 사항이며 지정하지 않으면 기본값은 0입니다.
  • 날짜(str) – 변환하다 String 해당하는 DateTime 가치. 예외가 발생합니다. 하위 버전 로 변환할 수 없습니다 DateTime. 목표 하위 버전 ISO-8601 형식이어야 합니다.
  • toBoolean(str) – 변환하다 String 해당하는 Boolean 가치. 결과 값은 다음과 같습니다. true 경우 String is "true" (대소문자 구분 없이). 그렇지 않으면 값은 다음과 같습니다. false.

JavaScript 호환 프로시저

다음 절차는 해당 JavaScript 문자열 메서드와 일치하는 구문과 의미 체계를 제공하도록 설계되었습니다.

  • concat(str, str1, … strN) – 연결하다 String 값 하위 버전 을 통하여 strN 그 순서대로 연결된 것을 반환합니다. String문자열은 다음을 사용하여 연결할 수도 있습니다. + 연산자.
  • endsWith(str, substr) – true를 반환합니다. 하위 버전 로 끝납니다 String 지정 하위 문자열.
  • 포함(str, substr) – true를 반환합니다. 하위 문자열 어디에서나 발견됩니다 하위 버전검색은 항상 첫 번째 문자로 시작합니다. 하위 버전.
  • indexOf(str, substr) – 위치를 반환합니다. 하위 버전 첫 번째 발생의 String 지정 하위 문자열일치하는 문자열이 없으면 -1을 반환합니다. 검색은 항상 첫 번째 문자로 시작합니다. 하위 버전.
  • lastIndexOf(str, substr) – 위치를 반환합니다. 하위 버전 마지막 발생의 String 지정 하위 문자열일치하는 문자열이 없으면 -1을 반환합니다. 검색은 항상 마지막 문자로 시작합니다. 하위 버전.
  • 길이(str) – 길이를 반환합니다. 하위 버전 코드 단위(ASCII 문자의 경우 코드 단위의 수는 문자열의 문자 수와 같음).
  • match(str, pattern) – 반환 Array 포함 String 내부의 값 하위 버전 일치하는 정규식 지정 무늬반환 값은 다음과 같습니다. Array of String 가치, 또는 null 일치하는 항목이 발견되지 않은 경우.
  • 매치(str, 패턴) – true를 반환합니다. 하위 버전 의 전체 일치입니다 정규식 지정 무늬.
  • 반복(str, count) – 반환 String 포함 하위 버전 중복 된 계산 시간.
  • replace(str, pattern, newSubStr) – 모든 발생을 대체합니다 무늬 발견 된 하위 버전 과 새로운 SubStr. 그만큼 무늬 일 수 있습니다 정규식 또는 String 정규 표현식으로 구문 분석됩니다. 새로운 SubStr ~이어야합니다. String, 구현에는 다음이 필요합니다. \ 문자는 마치 그것이 정규식JavaScript 특수 대체 패턴은 지원되지 않습니다. 새로운 SubStr.
  • 검색(str, 패턴) – 첫 번째 일치 항목의 인덱스를 반환합니다. 무늬 이내 하위 버전. 그만큼 무늬 하는 정규식일치하는 항목이 없으면 -1을 반환합니다.
  • 슬라이스(str, 시작, 끝) – 하위 문자열을 반환합니다. 하위 버전 지정된 인덱스에서 시작 스타트 인덱스에 지정된 문자를 포함하지 않고 그 이전까지 end. 면 end 지정되지 않으면 지정된 인덱스에서 시작하는 하위 문자열을 반환합니다. 스타트 그리고 이후의 모든 문자를 포함합니다. 하위 버전.
  • split(str, 패턴, 제한) – 반환 Array of String 나타내는 값 하위 버전 지정된 구분 기호로 하위 문자열로 나뉩니다. 무늬구분 기호가 제거됩니다. 제한 생성할 수 있는 분할의 최대 개수입니다.
  • startsWith(str, substr) – true를 반환합니다. 하위 문자열 인덱스 0에서 시작하는 문자와 일치합니다. 하위 버전.
  • substr(str, begin, length) – 하위 문자열을 반환합니다. 하위 버전 지정된 인덱스에서 시작 시작하다 그리고 함유 길이 문자. 값이 길이 문자열의 실제 길이보다 큰 경우 IndexOutOfBounds 예외가 발생합니다.
  • substring(str, begin, end) – 하위 문자열을 반환합니다. 하위 버전 지정된 인덱스에서 시작 시작하다, 지정된 인덱스를 포함하지 않고 최대 end. 면 end 지정하지 않으면 문자열 끝까지의 모든 문자가 포함됩니다.
  • toLowerCase(str) – 모든 대문자를 변환합니다. 하위 버전 소문자로 변환하여 반환합니다. String.
  • toUpperCase(str) – 모든 소문자를 변환합니다. 하위 버전 대문자로 변환하여 반환합니다. String.
  • 트림(str) - 반품 하위 버전 앞뒤의 공백을 제거합니다.

유틸리티 절차

다음은 추가 사항입니다 String 유틸리티 절차.

  • io.vantiq.text.Strings.format(str, args) – 반환 String 배열로 전달된 임의의 수의 매개변수 값을 지정된 패턴에 대입하여 생성됩니다. 하위 버전. 참조 문자열 형식화 자세한 내용은 더 이상 사용되지 않는 format 이 프로시저는 허용할 수 있는 매개변수 개수에 제한이 있습니다(15). io.vantiq.text.Strings.format은 매개변수 배열을 허용하므로 허용할 수 있는 값 개수에 제한이 없습니다.
  • 형식(str, p0, …) [더 이상 사용되지 않음] – 다음을 반환합니다. String 매개변수 값을 대입하여 생성됨 p0 을 통하여 pN 지정된 패턴으로 하위 버전. 참조 문자열 형식화 를 참조하세요
  • isAlpha(str) - 반품 true if 하위 버전 문자(a-zA-Z)만 포함합니다.
  • isAlphaNumeric(str) - 반품 true if 하위 버전 알파벳과 숫자만 포함합니다.
  • 16진수(str) - 반품 true if 하위 버전 (a-fA-F0-9)만 포함합니다.
  • isName(str) - 반품 true if 하위 버전 유효한 리소스 식별자입니다(정규 표현식 사용) [a-zA-Z0-9\$_-]*).
  • isNumeric(str) - 반품 true if 하위 버전 숫자(0-9)만 포함합니다.
  • isReal(str) - 반품 true if 하위 버전 법적을 나타냅니다 Real 값(숫자(0-9)만 포함, 점 XNUMX개 이하).)).
  • trimLeft(str) – 선행 공백 제거 하위 버전. 잘린 부분을 반환합니다. String.
  • trimRight(str) – 후행 공백을 제거합니다. 하위 버전. 잘린 부분을 반환합니다. String.
  • 공백으로(str, char) – 모든 공백 문자를 지정된 값으로 강제 적용합니다. 이륜 전차. 그만큼 이륜 전차 매개변수는 다음과 같아야 합니다. String 단일 문자를 포함합니다. 수정된 문자를 반환합니다. String.

정규 표현식

정규 표현식 패턴은 다음을 지원하는 프로시저에서 사용할 수 있습니다. String 정규 표현식을 사용하여 검색합니다.

정규 표현식 패턴은 다음을 호출하여 생성할 수 있습니다. 정규식() 순서.

  • regExp(패턴문자열) – 제공된 문자열 값으로 표현된 정규 표현식에서 정규 표현식 패턴을 생성합니다. 패턴문자열 매개변수. 패턴 문자열 형식에 대한 자세한 내용은 다음을 참조하세요. 무늬.

를 사용할 때 String 문자 패턴 문자열로서 VAIL이 자체적으로 수행한다는 것을 기억하십시오. 탈출 모두에게 \ 문자입니다. 이는 시퀀스를 의미합니다. \\ 로 바뀔 것이다 \ 전에 그것은 ~로 보내진다 정규식()예를 들어, 모든 것을 타겟팅하려는 경우 \ 문자열의 문자를 지정하려면 패턴을 지정해야 합니다. "\\\\" 로 보일 것입니다 "\\" 절차에 따라 ( 무늬 문서가 일치합니다 \).

결과 정규 표현식은 값으로 사용될 수 있습니다. 무늬 일치, 교체 및 검색 절차에 대한 매개변수입니다.

정수 프로시저

다음 내장 프로시저를 사용하면 편리하게 작동할 수 있습니다. Integer 값.

유형 변환 절차

다음 절차를 사용하여 명시적으로 변환을 수행할 수 있습니다. Integer 다른 사람에게 가치를 부여하다 표준형:

  • toReal(정수값) – 변환하다 Integer 해당하는 Real 가치.
  • toString(intValue) – 변환하다 Integer 해당하는 String 가치.
  • toDate(intValue) – 변환하다 Integer 해당하는 DateTime 가치. 목표 intValue 이어야합니다 에포크 밀리초 값.
  • toBoolean(intValue) – 변환하다 Integer 해당하는 Boolean 가치. 결과 값은 다음과 같습니다. true 경우 Integer 가치는 1   false 경우 Integer 가치는 0그렇지 않으면 예외가 발생합니다.

유틸리티 절차

다음은 추가 사항입니다 Integer 유틸리티 절차.

  • 범위(시작, 종료, 증가) – 반복 가능한 범위를 생성합니다. Integer 로 시작하는 값 , 증가 증가, 그리고 값보다 작은 숫자로 끝납니다. . 이것은 숫자 범위를 반복하는 데 유용할 수 있습니다. FOR 성명서.

실제 절차

다음 내장 프로시저를 사용하면 편리하게 작동할 수 있습니다. Real 값.

유형 변환 절차

다음 절차를 사용하여 명시적으로 변환을 수행할 수 있습니다. Real 다른 사람에게 가치를 부여하다 표준형:

  • 정수로(실제값) – 변환하다 Real 해당하는 Integer 가치. 그만큼 Real 필요한 경우 값이 잘립니다.
  • toString(실제 값) – 변환하다 Real 해당하는 String 가치.
  • toDecimal(실제 값, 스케일) – 변환하다 Real 해당하는 Decimal 가치. 매개 변수 scale 선택 사항이며 지정하지 않으면 기본값은 0입니다.
  • toBoolean(실제 값) – 변환하다 Real 해당하는 Boolean 가치. 결과 값은 다음과 같습니다. true 경우 Real 가치는 1.0   false 경우 Real 가치는 0.0그렇지 않으면 예외가 발생합니다.

DateTime 프로시저

다음 내장 프로시저를 사용하면 편리하게 작동할 수 있습니다. DateTime 값. Java의 메서드에 유의하세요 Instant 또한 다음과 같은 것도 사용 가능합니다. myDate.toEpochMilli().

유형 변환 절차

다음 절차를 사용하여 명시적으로 변환을 수행할 수 있습니다. DateTime 다른 사람에게 가치를 부여하다 표준형:

JavaScript 호환 프로시저

다음 절차는 해당 JavaScript 날짜 메서드에 맞는 구문과 의미 체계를 제공하도록 설계되었습니다.

  • getMilliseconds(날짜) – 날짜의 밀리초 구성 요소(0-999)
  • getSeconds(날짜) – 날짜의 초 구성 요소(0-59)
  • getMinutes(날짜) – 날짜의 분 구성 요소(0-59)
  • getHours(날짜) – 날짜의 시간 구성 요소(0-23)
  • getDate(날짜) – 월 내의 일로 반환되는 날짜의 일 구성 요소(1-31)
  • getMonth(날짜) – 1년 중 월(12-XNUMX)
  • getFullYear(날짜) – 그 해
  • getDay(날짜) – 요일은 1부터 월요일부터 7까지, 일요일까지입니다. 이는 일요일부터 0부터 6까지 요일을 나타내는 일반적인 Javascript 요일 번호 매기기와 다릅니다.
  • getTime(날짜) – 시간(밀리초) epoch(표준 Java epoch)

유틸리티 절차

다음은 추가 사항입니다 DateTime 유틸리티 절차:

  • 날짜(값, 소스 표현, 목적지 표현) – 제공된 날짜를 다음과 같이 변환합니다. 가치 현재 표현에서 지정된 대상 표현으로 변환합니다. 예를 들어, 기본 날짜로 표현된 날짜를 ISO 날짜 문자열로 변환합니다.date(now(), "date", "ISO")

    또 다른 예: 날짜를 epochMilliseconds에서 epochDays로 변환하여 날짜에서 시간을 효과적으로 잘라내어 일 구성 요소만 남깁니다.

    var ems = date(now(), "date", "epochMilliseconds")
    date(ems, "epochMilliseconds", "epochDays")

    또 다른 일반적인 예는 날짜를 표준 표현에서 epochMinutes로 변환하는 것입니다.

    date(now(), "date", "epochMinutes")

    The 소스 표현   목적지 표현 매개변수는 다음 문자열 값 중 하나일 수 있습니다.

    • 데이터
    • ISO
    • 시대일
    • 에포크아워즈
    • 에포크분
    • 에포크초
    • 에포크밀리초
    • 에포크마이크로초
  • 지금() – 다음을 반환합니다. DateTime 현재 날짜와 시간을 나타내는 값입니다.
  • parseDate(str, dateFormat) – 변환하다 String 해당하는 DateTime 가치 주어진 날짜 형식 패턴을 사용합니다. 참조 간단한 날짜 형식 지원되는 형식 패턴에 대해. 시간대를 지정하지 않으면 UTC로 간주됩니다. 시간 필드를 지정하지 않으면 하루 시작으로 간주됩니다.
  • truncateTo(날짜, chronoUnit) – 주어진 것을 잘라내다 DateTime 지정된 값 chronoUnit (주어진 것으로서 String 값). 모든 법적 지원 자바 크로노유닛 최대 DAYS까지의 값입니다.
  • addMonth(날짜, 월 오프셋, 마지막 날 보존) – 반환 데이터 원래 날짜와 같은 달의 날짜에 대응하여 조정됨 월 오프셋 개월. 만약 월 오프셋 음수이면 날짜가 과거로 이동합니다. 매개변수 보존 마지막 날 선택 사항이며 기본값은 다음과 같습니다. false예를 들어, 다음과 같이 가정해 봅시다. monthOffset = 1:
    • 다음 달에도 같은 날짜가 존재한다면,

      2024-01-11T10:20:33 -> 2024-02-11T10:20:33

    • 현재 날짜가 다음 달 마지막 날짜보다 큰 경우 다음 달 마지막 날짜가 반환됩니다.

      2024-01-31T10:20:33 -> 2024-02-29T10:20:33

    • 현재 날짜가 해당 월의 마지막 날짜인 경우 결과는 preserveLastDay 값에 따라 달라집니다.

      2024-02-29T10:20:33 -> 2024-03-29T10:20:33 과 보존 마지막 날 = false
      2024-02-29T10:20:33 -> 2024-03-31T10:20:33 과 보존 마지막 날 = true

  • addYear(날짜, yearOffset, preserveLastDay) – 반환 데이터 원래 날짜와 같은 달의 날짜에 대응하여 조정됨 yearOffset 년. 만약 yearOffset 음수이면 날짜가 과거로 이동합니다. 매개변수 보존 마지막 날 선택 사항이며 기본값은 다음과 같습니다. false. 같은 논리 addMonth 적용됩니다.

다음 절차는 날짜의 일부를 추출합니다(date() 연산에서 설명한 대로 날짜의 하위 구성 요소를 잘라내는 것과 반대).

  • 주(날짜) – 현재 연도의 주(1-52)
  • DoW(날짜) – 요일 번호 1 – 월요일부터 7 – 일요일
  • HoW(날짜) – 주 중 0부터 시작하는 시간
  • MoW(날짜) – 주 내의 분(minute)은 0부터 시작합니다.
  • DoY(날짜) – 1부터 시작하는 연도 내의 날짜
  • MoD(날짜) – 하루의 분(0-1439)
  • SoD(날짜) – 하루 중 두 번째(0-86399)
  • SoH(날짜) – 시간의 두 번째(0-3599)

간격 절차

  • 문자열간격(str) – 문자열에 포함된 밀리초 수를 반환합니다. 간격 리터럴 로 Integer 값. 예를 들어, stringToInterval("1 second") 1000으로 평가됩니다.
  • 밀리초당 지속시간(str) – 주어진 ISO 8601 지속 시간 문자열로 지정된 밀리초 수를 반환합니다. 예:
 var millisecondsInOneDay = durationInMillis("P1D")

다음을 사용하여 날짜에 간격을 추가하거나 뺄 수 있습니다. 방법 표준에 정의된 데이터 유형 :

  • .plusMillis(간격)
  • .minusMillis(간격)

예:

var twoDaysFromNow = now().plusMillis(2 days)

의 사용 방법 plusMillis는 등록된 VAIL 프로시저가 아니라 기본 날짜 유형에 정의된 메서드이므로 스타일 호출이 필요합니다.

시간대 절차

  • timezoneOffset(zoneId, 날짜) – 지정된 시간의 zoneId에 대한 시간대 오프셋을 반환합니다. 예:
var offset = timezoneOffset("America/New_York", now())

// return "-07:00"
timezoneOffset("America/Los_Angeles", date("2022-05-08T10:00:00.000Z", "ISO", "date"))
// return "-08:00"
timezoneOffset("America/Los_Angeles", date("2022-11-06T10:00:00.000Z", "ISO", "date"))
  • getZoneIds() – zoneId가 문자열 값으로 표현된 zoneId 목록을 반환합니다.

객체 절차

다음 내장 프로시저를 사용하면 편리하게 작동할 수 있습니다. Object 값.

유형 변환 절차

다음 절차를 사용하여 명시적으로 변환을 수행할 수 있습니다. Object 다른 사람에게 가치를 부여하다 표준형:

  • toObject(obj) – "유형이 지정되지 않은" 값이 유형의 인스턴스임을 주장합니다. Object. 예외가 발생합니다. obj 실제로는 아니다 Object 예.
  • toDecimal(obj, scale) – 변환하다 Object 해당하는 Decimal 가치. 예외가 발생합니다. obj 로 변환할 수 없습니다 Decimal 값. 매개변수 scale 선택 사항이며 지정하지 않으면 기본값은 0입니다.
  • toCurrency(obj, scale) – 변환하다 Object 해당하는 Currency 가치. 예외가 발생합니다. obj 로 변환할 수 없습니다 Currency 값. 매개변수 scale 선택 사항이며 지정하지 않으면 기본값은 0입니다.
  • toGeoJSON(obj) – 변환하다 Object 해당 값에 대한 값 GeoJSON 가치.

JavaScript 호환 프로시저

다음 절차는 해당 JavaScript 개체 메서드와 일치하는 구문과 의미 체계를 제공하도록 설계되었습니다.

  • clear(obj) – 정의된 모든 속성을 제거합니다. objclear가 반환하는 결과는 null 값입니다.
  • deleteKey(obj, 키) – 이름이 지정된 속성을 제거합니다.  에 objdeleteKey()가 반환하는 결과는 삭제된 값이 있으면 삭제된 값이고, 그렇지 않으면 null 값입니다.
  • has(obj, key) – true를 반환합니다. obj 라는 이름의 속성이 포함되어 있습니다. .

일반적인 유틸리티 절차는 다음과 같습니다.

  • 객체.복제(obj) – 주어진 사본을 반환합니다. Object obj. 원본에 영향을 주지 않고 필드를 수정할 수 있습니다. Object. "메서드 스타일"이 아닌 프로시저로 호출해야 합니다.

리소스 참조 절차

다음 내장 프로시저를 사용하면 편리하게 작동할 수 있습니다. ResourceReference 값.

유틸리티 절차

  • Utils.buildResourceRef(리소스 유형, 인스턴스) – 리소스 참조를 구성합니다. String 리소스 인스턴스의 경우. 이 절차는 다음을 확인합니다. resourceType 존재하고 해당 정의를 사용하여 속성을 추출합니다. resourceId 주어진에서 instance시스템 리소스를 처리할 때는 기본 유형 이름이 아닌 정규화된 리소스 이름을 지정해야 합니다(예: system.users 하지 ArsUser).
  • Utils.buildResourceRefMap(리소스 유형, 인스턴스) – 와 동일 Utils.buildResourceRef(), 그러나 반환합니다 리소스 참조 내부적으로 Object 형식({ 리소스: …, 리소스 ID: …}).
  • Utils.get(참조) – 다음에 의해 식별된 리소스 인스턴스를 가져옵니다. 리소스 참조 심판.
  • Utils.getNamespaceAndProfiles() 현재 사용자/토큰에 대한 네임스페이스와 프로필을 반환합니다.
  • Utils.packageReference(ref, forceBase64) 를 반환 패키지 참조 Vantiq 문서, 이미지 또는 비디오를 소스로 보내고 받는 데 사용됩니다. ref 매개변수가 필요하며 다음이어야 합니다. 리소스 참조. 그만큼 forceBase64 매개변수는 선택적 부울 값이며 사용됩니다(, 로 설정 true) 결과 데이터가 base64로 인코딩되어야 하는 경우에만 해당됩니다. 지정하지 않으면 ref 필요한 경우에만 base64로 인코딩됩니다(컨텍스트 및 fileType 참조된 Vantiq 문서, 이미지 또는 비디오.

배열 프로시저

다음 내장 프로시저를 사용하면 편리하게 작동할 수 있습니다. Array 값.

JavaScript 호환 프로시저

다음 절차는 해당 JavaScript 배열 메서드에 맞는 구문과 의미 체계를 제공하도록 설계되었습니다.

  • concat(arr, 연결된 배열) – 값을 추가합니다 연결된 배열 ~에 있는 사람들에게 아아 결합된 것을 반환 Array.
  • fill(arr, value, begin, end) – 항목을 채우세요 아아 인덱스에서 시작 시작하다 그리고 인덱스에서 끝납니다 (end – 1) 와 함께 가치fill()에서 반환된 결과는 채워진 것입니다. Array.
  • (arr, element)를 포함합니다 - 반품 true 경우 요소 일원이다 아아.
  • indexOf(arr, 요소) – 첫 번째 항목의 인덱스를 반환합니다. 아아 포함 요소.
  • join(arr, 구분자) – 반환 String 모든 항목의 연결로 구성됨 아아 로 변환 String 그리고 로 분리된 String 지정 분리 기호.
  • lastIndexOf(arr, 요소) – 마지막 항목의 인덱스를 반환합니다. 아아 포함 요소.
  • 길이(arr) – 길이를 반환합니다. 아아.
  • 팝(편곡) – 마지막 요소를 반환합니다. 아아 그리고 그것을 제거 아아.
  • push(arr, element) – 요소를 끝에 추가합니다. 아아. 반환 true 요소가 추가된 경우.
  • 역방향(arr) – 요소를 반전합니다 아아.
  • shift(arr) – 첫 번째 요소를 반환합니다. 아아 요소를 제거하다 아아.
  • 슬라이스(arr, begin, end) – 반환 Array 의 요소를 포함하는 아아 지정된 인덱스에서 시작 시작하다 그리고 (로 지정된 인덱스에서 끝납니다.end - 1)
  • 정렬(arr) – 요소를 정렬합니다 아아 오름차순으로.
  • 정렬(arr, 속성) – 정렬하다 Object 값 아아 주어진 값의 오름차순을 기준으로 재산예를 들어, [{“a”:7},{“a”:3},{“a”:5}]는 sort(“a”)를 호출하면 [{“a”:3},{“a”:5},{“a”:7}]로 정렬됩니다.
  • splice(arr, begin, deleteCount, list) – 지정된 인덱스에서 시작하다, 지정된 요소의 개수를 삭제합니다. 삭제 개수 그리고 다음에 요소를 추가합니다. 명부.
  • unshift(arr, element) – 첫 번째 항목으로 요소를 추가합니다. 아아 모든 기존 요소를 unshift 호출 전보다 인덱스가 하나 더 커지도록 이동합니다. 반환 값은 없습니다.

유틸리티 절차

다음은 추가 사항입니다 Array 유틸리티 절차.

  • 크기(배열) – 길이를 반환합니다. 아아
  • removeAt(arr, index) – 지정된 위치에서 요소를 제거합니다. 색인 에 아아. 제거된 항목을 반환합니다. Array.
  • remove(arr, element) – 모든 발생을 제거합니다 요소 에 아아. 보고 true 해당 요소가 제거된 경우.
  • removeElement(arr, element) – 첫 번째 발생을 제거합니다. 요소 배열에서. 반환 true 해당 요소가 제거된 경우.
  • addAll(arr, elementArr) – 모든 요소를 ​​추가합니다 요소 배열 에 아아. 반환합니다 true 배열의 내용이 변경되는 경우.
  • 납작하게 하다(arr) - 만약 아아 배열을 포함하는 경우 포함된 모든 배열을 제거하고 해당 요소를 추가합니다. 아아. 수정된 내용을 반환합니다. Array.
  • clear(arr) – 모든 요소를 ​​제거합니다 아아. clear()에서 반환된 결과는 다음과 같습니다. null 값.
  • toSequence(arr) – 주어진 값을 순서 표준을 사용한 값 유형 변환 규칙.
  • 배열(arr)로 – 주어진 값을 다음으로 변환합니다. 배열 표준을 사용한 값 유형 변환 규칙.

일반 사용 절차

편의를 위해 일반적으로 유용한 여러 절차가 미리 정의되어 있습니다.

JavaScript 호환 프로시저

다음 절차는 해당 JavaScript 글로벌 메서드와 일치하는 구문과 의미 체계를 제공하도록 설계되었습니다.

URI 절차

  • decodeUri(인코딩된Uri) – encodeUri()로 이전에 인코딩된 URI를 디코딩합니다.
  • decodeUriComponent(인코딩된UriComponent) – 이전에 인코딩된 URI 구성 요소를 디코딩합니다. 인코딩UriComponent().
  • 인코딩Uri(str) – 다음에 의해 표현되는 전체 URI를 인코딩합니다. 하위 버전.
  • 인코딩UriComponent(str) – URI 구성 요소를 인코딩합니다. 하위 버전.
  • 이스케이프(str) – >, <, &, ”를 >, <, &, " 등의 HTML 엔터티로 바꿉니다.

콘텐츠 구문 분석 절차

  • stringify(대상, prettyPrint) – 변환하다 목표 에 String JSON 표현을 포함합니다. 예쁜 인쇄 is true, 결과 JSON String 더 읽기 쉬운 형식으로 포맷됩니다. 예쁜 인쇄 is false 결과 String JSON 객체를 표현하는 데 필요한 최소 문자 수를 포함합니다.
  • 구문 분석(str) – 내용을 구문 분석합니다 하위 버전 JSON으로 String 해당되는 것을 생산하다 표준형 값.
  • parseXml(str) – 내용을 구문 분석합니다 하위 버전 XML로 String 생산하다 Object 조작할 수 있는 XML 구조의 표현 그루비 GPath 표기법.
  • parseInt(str) – 내용을 구문 분석합니다 하위 버전 생산하기 위해 Integer. 에 해당 정수로.
  • parseFloat(str) – 내용을 구문 분석합니다 하위 버전 생산하기 위해 Real. 에 해당 실제.

기타 절차

  • typeOf(대상) – 런타임 유형을 결정합니다. 목표반환되는 값은 다음과 같습니다. String VAIL 중 하나의 이름이 포함되어 있습니다 표준 유형.
  • classOf(obj, 완전히 정규화된) – 기본 클래스를 결정합니다. obj. GenAIFlow 코드의 심층적인 디버깅을 위한 것입니다. 반환되는 값은 다음과 같습니다. String 클래스의 이름을 포함하는 obj기본적으로 간단한 클래스 이름(예: "문자열")입니다. 완전히 자격을 갖춘 is true, 전체 이름(예: "java.lang.String")을 반환합니다.
  • uuid() – 고유한 128비트 식별자를 생성합니다.
  • geoDistance(점A, 점B) – A 지점과 B 지점 사이의 구면 거리를 계산하고 그 결과를 미터 단위로 반환합니다. A 지점과 B 지점의 형식은 {“type”: “Point”, “coordinates”: [0, 0]}와 같은 GeoJSON 형식이거나 “POINT(0 0)”과 같은 WKT 문자열 형식일 수 있습니다. (이 절차는 구면 거리를 계산할 때 고도(지정된 경우)를 고려하지 않습니다.)

유틸리티 절차

  • 예외(코드, 메시지, 매개변수) - 암호 하는 String 오류 코드가 포함되어 있음 메시지 하는 String 연관된 오류 메시지가 포함되어 있습니다. 메시지 값은 다음을 사용하여 처리됩니다. 메시지 포맷터 공급된 것과 함께 매개 변수. 호출 결과 예외() 절차는 시스템이 구성하고 던진다는 것입니다. 예외.
  • (예외)를 다시 던지다 - 예외 는 Teledyne LeCroy 오실로스코프 및 LSA-XNUMX 시리즈 임베디드 신호 분석기가  Object Vantiq 시스템의 오류 값에 대한 모든 키/값 쌍으로 구성됨(참조) 오류 처리 ). 일반적으로 예외 매개변수의 값은 다음에서 나옵니다. 시도하다 / 잡다 VAIL의 코드 블록. 다시 던지다() 예외를 catch하고, 몇 가지 확인이나 다른 처리를 수행한 후 다시 throw하고 싶을 때 유용합니다. 다시 던지다()개발자는 전화할 것입니다 예외() 이를 위해 catch된 오류 값에서 개별 값을 전달합니다. 이는 안티패턴이므로 피하고 다음 방법을 사용해야 합니다. 다시 던지다()이렇게 하면 초기 서식 지정이 완료된 후 이스케이프되지 않은 특수 문자가 포함된 메시지의 경우 문제가 될 수 있는 오류 메시지의 이중 서식 지정을 방지할 수 있습니다. 예외() 내장은 VAIL에서 새로운 예외를 생성할 때만 사용해야 합니다.
  • 임계값(이전값, 새값, 임계값, 방향) – 반환 true 경우 임계값 지정된 것은 사이에 교차되었습니다 이전값 그리고 새로운 값. 그만큼 방향 값은 String 다음 중 하나를 포함:
    • increasing – 새 값이 이전 값보다 큽니다.
    • decreasing – 새 값이 이전 값보다 작습니다.
    • either – 임계값은 증가 또는 감소 방향으로 넘어갔습니다.

내장 서비스

에 설명 된대로 서비스 섹션 리소스 가이드에서 서비스는 프로시저 모음을 구성하는 데 사용되는 리소스입니다. 다음은 기본 제공 서비스 목록입니다.

콜백

The io.vantiq.콜백 서비스는 클라이언트가 다른 서비스에서 호출할 수 있는 "콜백"을 등록할 수 있는 수단을 제공합니다. 콜백이 완료되면 "호출자"에게 값을 반환하여 처리를 재개할 수 있습니다. 기본적으로 다음과 같은 기능을 제공합니다. 서비스 절차 호출 대상이 다음과 같은 경우 지원 서비스(대부분은 다음과 같습니다. Vantiq 클라이언트). 여기에는 다음 절차가 포함되어 있습니다.

  • Callback.register(callbackId 문자열 필수): 문자열 – 주어진 값으로 새로운 콜백을 등록합니다. 콜백 ID. id 값은 현재 네임스페이스에서 고유해야 합니다. 반환 값은 호출 이벤트가 도착하는 이벤트 경로입니다. 호출자는 이러한 이벤트를 구독하고 수신 시 응답해야 합니다. 호출 이벤트에는 다음과 같은 속성이 있습니다.
    • callbackId – 호출되는 콜백의 ID입니다.
    • invocationId – 이 호출의 ID입니다.
    • data – 콜백이 호출되었을 때 제공된 데이터.
  • Callback.invoke(callbackId 문자열 필수, 데이터 임의 필수, timeout 정수): 임의 – 식별된 콜백을 호출하여 제공된 데이터를 전송합니다. 선택 사항 시간 제한 값은 호출자가 응답을 기다리는 시간을 정의하는 밀리초 단위의 간격입니다. 기본적으로 호출자는 무기한 대기합니다. 호출 시간이 초과되면 오류 코드와 함께 예외가 생성됩니다. io.vantiq.rulemgr.execution.callback.timeout반환 값은 콜백 호출에서 제공된 응답입니다.
  • Callback.sendResponse(callbackId 문자열 필수, invocationId 문자열, 필수, response 임의 필수) – 지정된 콜백의 호출에 응답합니다. 제공된 값은 응답 콜백 호출자에게 전송됩니다.

잡담

The 잡담 이 서비스는 Vantiq 모바일 앱의 메시징 구성 요소와 상호 작용하기 위한 일련의 절차를 구현합니다. 여기에는 다음 절차가 포함됩니다.

  • Chat.addUser(chatId, usersToBeAdded) – 사용자를 추가합니다 추가될 사용자 채팅방으로 (아르스챗 인스턴스)로 식별됨 채팅 ID
  • Chat.createChatroom(상황ID, 주제, 사용자) – 이름으로 채팅방을 만듭니다. 화제 식별된 상황과 관련된 상황 ID 그리고 모든 사용자에게 초기 메시지를 보냅니다. 사용자 채팅방이 초기화되었음을 알리는 목록입니다.
  • 채팅.채팅방 삭제(채팅ID) – 삭제하다 아르스챗 다음으로 식별되는 인스턴스 채팅 ID.
  • Chat.removeUser(채팅 ID, 제거할 사용자) – 모든 사용자를 제거합니다. 제거할 사용자 식별된 채팅방의 목록 채팅 ID.
  • Chat.sendMessage(채팅 ID, 유형, 메시지, 메타데이터, 사용자 목록, 보낸 사람) – 식별된 채팅방에 메시지를 보냅니다. 채팅 ID 과 메시지 메시지 텍스트로 지정합니다. 텍스트 메시지의 경우 유형 다른 메시지 유형의 경우 "텍스트"로 메타 데이터 메시지 내용에 대한 추가 세부 정보를 제공하는 데 사용할 수 있습니다. 사용자 목록 새 메시지를 알릴 사용자 목록을 지정하는 데 사용할 수 있습니다(빈 목록이나 null이 제공된 경우 모든 사용자에게 알림이 전송됨). 보낸 사람 이름을 다음으로 재정의합니다. 송신기.
  • Chat.updateChatrooms(사용자 이름, 이전 채팅방) – 사용자가 지정한 채팅방의 변경 사항을 가져오기 위해 모바일 앱에서 사용됩니다. 사용자 이름 구독 중입니다.

채팅메시지

The io.vantiq.ai.ChatMessage 서비스는 인스턴스에 대한 빌더를 구현합니다. io.vantiq.ai.ChatMessage 스키마 유형입니다. 이 유형에는 다음과 같은 속성이 있습니다.

  • 유형 (문자열) – 제공되는 메시지 유형입니다. 유효한 값은 다음과 같습니다.
    • human – 메시지에 사용자의 입력이 포함되어 있습니다.
    • ai – 메시지에는 LLM의 응답이 포함되어 있습니다.
    • system – 메시지에는 LLM의 출력을 안내/제약하는 데 도움이 되는 지침이 포함되어 있습니다.
    • chat – 메시지에는 채팅 응답이 포함되어 있습니다(다음과 겹침) human).
    • function - (사용되지 않는) 메시지에는 요청된 함수 호출의 결과가 포함되어 있습니다.
    • tool – 메시지에는 요청된 도구 호출의 결과가 포함되어 있습니다.
  • 함유량 (문자열, 문자열[] 또는 객체[]) - (선택 사항) 메시지 내용입니다.
  • ars_properties (객체) - 애플리케이션별 정보를 저장하는 데 사용할 수 있는 이름/값 쌍의 컬렉션입니다.
  • 함수 이름 (끈) - (사용되지 않는) 함수 이름입니다. 메시지가 함수 호출 요청이나 함수 호출 결과를 나타내는 경우에만 사용됩니다.
  • 함수 인수 (물체) - (사용되지 않는) 명명된 함수 인수에 사용할 값을 나타내는 속성을 가진 객체입니다. 메시지가 함수 호출 요청을 나타내는 경우에만 사용됩니다.
  • name (문자열) – 도구의 이름입니다. 도구 호출 LLM 응답 메시지의 설명 및 도구 결과 메시지의 도구 이름으로 사용됩니다.
  • 도구_호출_ID (문자열) – 도구 식별자를 제공합니다. 도구 호출 LLM 응답 메시지 내의 설명입니다. 이 값은 LLM에서 도구 호출 요청(도구 호출) 도구 호출 결과 메시지와 함께.

ChatMessage 인스턴스는 다음에 의해 사용됩니다. 대화형 기억LLM   의미 검색 서비스를 제공합니다.

ChatMessage 빌더

채팅 메시지 작성을 지원하기 위해 Vantiq는 특정 유형의 채팅 메시지를 작성하는 데 사용되는 내장 프로시저인 여러 "빌더"를 제공합니다. 가장 일반적으로 사용되는 빌더는 다음과 같습니다.

  • ChatMessage.buildHumanMessage(내용 필수, 속성 개체) – 다음 유형의 메시지를 작성합니다. human 주어진 내용으로.
  • ChatMessage.buildSystemMessage(content 필수, 속성 개체) – 유형의 메시지를 작성합니다. system 주어진 내용으로.

이를 통해 LLM 프롬프트를 사용자 요청(사용자 메시지) 또는 LLM에 대한 사전 조건/지시(시스템 메시지)로 해석할 수 있도록 구성할 수 있습니다. 가장 간단한 경우, 제공되는 콘텐츠는 "프롬프트"를 포함하는 단일 문자열입니다. 하지만 이 빌더는 문자열 배열이나 Object 인스턴스. 후자는 모델이 지원하는 경우 더 복잡한 프롬프트를 구성하는 데 사용됩니다. 예를 들어, "멀티 모달" 모델(예: OpenAI의 GPT-4o)은 분석을 위해 프롬프트에 이미지 데이터를 포함할 수 있는 기능을 제공합니다. 다음 VAIL 코드는 텍스트 프롬프트와 이미지 참조(이 경우 URL 사용)를 모두 포함하는 메시지를 생성합니다.

var msg = io.vantiq.ai.ChatMessage.buildHumanMessage([
    {type: "text", text: prompt},
    {type: "image_url", image_url: {url: imageUrl}},
])

The image_url.url 값은 다음과 같이 제공될 수 있습니다. 리소스 참조 ~를 언급하다 문서영상및 임시 블롭 인스턴스. 이러한 경우 참조된 리소스가 구체화됩니다(다음에 따라). documentExpansion 할당량)을 프롬프트의 일부로 제출했습니다. documentExpansion 할당량은 다음에서 찾을 수 있습니다. 관리자 참조 가이드.

The 속성 매개변수는 선택 사항입니다. 이 매개변수가 있는 경우 값은 다음 위치에 배치됩니다. ars_properties 채팅 메시지의 속성입니다.

LLM "도구" 개발을 지원하기 위해 LLM에 도구의 출력을 전달하는 데 사용되는 빌더도 제공합니다.

  • ChatMessage.buildToolResultMessage(name 문자열 필수, content 문자열 필수, toolCallId 문자열 필수, properties 개체) – 다음 유형의 메시지를 구성합니다. tool 주어진 내용으로. LLM 참조 가이드를 참조하세요. 도구 섹션 예를 들어.
  • ChatMessage.buildFunctionResultMessage(functionName 문자열 필수, result 필수, 속성 개체) - (사용되지 않는) 유형의 메시지를 구성합니다. function 주어진 결과와 함께.

이 서비스는 또한 보다 전문화되어 일반적으로 매우 특수한 사용 사례나 테스트 외에는 사용되지 않는 빌더를 정의합니다.

  • ChatMessage.buildAIMessage(내용 필수, 속성 개체) – 다음 유형의 메시지를 구성합니다. ai 주어진 내용으로.
  • ChatMessage.buildChatMessage(내용 필수, 속성 개체) – 다음 유형의 메시지를 구성합니다. chat 주어진 내용으로.
  • ChatMessage.buildFunctionCallMessage(functionName 문자열 필수, 인수 객체, 속성 객체) – 다음 유형의 메시지를 구성합니다. ai 이는 제공된 인수로 명명된 함수를 호출하라는 요청을 나타냅니다. 참고 – 일반적으로 이 유형의 메시지는 LLM에서 반환되며 애플리케이션에서 생성되지 않습니다.

Client

The Client 이 서비스는 푸시 알림을 사용하여 클라이언트를 모바일 기기로 전송하는 절차를 포함합니다. 이 서비스는 다음과 같은 절차를 포함합니다.

  • Client.sendByName(pushSourceName, 제목, 자막, 사용자, 클라이언트 이름) – 지정된 사람에게 알림을 보냅니다. 사용자 식별된 푸시 소스를 사용하여 pushSourceName, 열면 클라이언트가 시작됩니다. 제목   부제 사용자의 휴대전화로 전송되는 푸시 알림의 제목과 메시지에 사용됩니다.

병발 사정

The 병발 사정 서비스는 애플리케이션 관리를 지원하는 동시 데이터 구조 생성을 지원합니다. 메모리 내 상태. 여기에는 다음 절차가 포함되어 있습니다.

  • 동시.맵() – 동시성 맵 데이터 구조의 인스턴스를 생성합니다. 이 인스턴스는 VAIL을 준수합니다. Map 다음 절차를 유형화하고 지원해야 합니다(다음 절차를 사용해야 함) 메서드 스타일 호출):
    • size(): 정수 – 맵이 보유한 키/값 쌍의 개수를 반환합니다.
    • isEmpty(): 부울 - 반품 true 맵에 키/값 쌍이 없는 경우.
    • containsKey(키 객체): Boolean - 반품 true 지도에 주어진 항목이 포함되어 있는 경우 key.
    • containsValue(값 객체): Boolean - 반품 true 지도에 주어진 항목이 포함되어 있는 경우 value.
    • get(키 객체): 객체 – 반환 value 주어진 것과 관련된 . 맵에 해당 매핑이 포함되어 있지 않으면 다음을 반환합니다. null.
    • getOrDefault(키 객체, defaultValue 객체): 객체 – 반환 가치 주어진 것과 관련된 . 맵에 해당 매핑이 포함되어 있지 않으면 다음을 반환합니다. defaultValue.
    • keySet () – 맵이 보유한 키의 반복 가능한 시퀀스를 반환합니다.
    • 값 () – 맵에 저장된 값의 반복 가능한 시퀀스를 반환합니다.
    • entrySet () – 맵 "entries"의 반복 가능한 시퀀스를 반환합니다(각 항목은 다음을 보유합니다.  및 관련 가치).
    • putIfAbsent(키 객체, 값 객체): 객체 – 주어진 매핑을 추가합니다.  주어진 가치 기존 매핑이 없는 경우 . 보고 null 매핑이 이전에 존재하지 않았던 경우이거나, 매핑이 있다면 현재 값입니다.
    • remove(키 객체, 값 객체): Boolean – 주어진 매핑을 제거합니다.  만약 현재 가치 주어진 것과 일치합니다. 반환합니다. true 매핑이 제거된 경우.
    • 키, 리매핑 함수를 계산합니다: 객체 – 특정 값과 연관된 값에 대한 스레드 안전 업데이트를 수행하는 데 사용됩니다.  지도에서. 리매핑 함수 ~이어야합니다. 함수 표현식 형태 : (key, value) => { <VAIL statements>* }. 이 함수는 제공된 것과 함께 호출됩니다.  그리고 가치 해당 키와 관련된 현재(다음과 같을 수 있음) null). 이 함수는 업데이트된 값을 반환할 것으로 예상됩니다. 가치 위한  or null 경우  지도에서 제거해야 합니다. 새 항목을 반환합니다. 가치 위한  or null 없는 경우.
    • 키, 리매핑 함수가 없는 경우를 계산합니다. 객체 – 새로운 값을 생성하는 데 사용됨  지도에 현재 존재하지 않는 것입니다. 리매핑 함수 ~이어야합니다. 함수 표현식 형태 : key => { <VAIL statements>* }. 이 함수는 제공된 것과 함께 호출됩니다. , 하지만 현재 맵에 연관된 값이 없는 경우에만 해당합니다. 이 함수는 새 값을 반환해야 합니다. 가치 위한 . 새로운 것을 반환합니다 가치 위한  or null 없는 경우.
    • 키, 리매핑 함수가 있는 경우, 해당 객체가 ComputeIfPresent(키, 리매핑 함수)입니다. – 특정 값과 연관된 값에 대한 스레드 안전 업데이트를 수행하는 데 사용됩니다.  지도에서. 리매핑 함수 ~이어야합니다. 함수 표현식 형태 : (key, value) => { <VAIL statements>* }. 이 함수는 제공된 것과 함께 호출됩니다.  그리고 가치 해당 키와 연관된 현재 값이지만 해당 값이 존재하는 경우에만 해당합니다. 함수는 업데이트된 값을 반환해야 합니다. 가치 위한  or null 경우  지도에서 제거해야 합니다. 새 항목을 반환합니다. 가치 위한  or null 없는 경우.
    • merge(키 객체, 값 객체, 리매핑 함수): 객체 – 지정된 경우  매핑이 없으면 주어진 매핑과 연결합니다. 가치. 그렇지 않으면 제공된 리매핑 함수 제공된 것과 함께 호출됩니다  그리고 기존 가치. 이 함수는 업데이트된 값을 반환할 것으로 예상됩니다. 가치 위한  or null 경우  지도에서 제거해야 합니다. 새 항목을 반환합니다. 가치 위한  or null 아무것도 없다면. 리매핑 함수 ~이어야합니다. 함수 표현식 형태 : (key, value) => { <VAIL statements>* }.
    • put(키 객체, 값 객체): 객체 – 설정합니다 가치 주어진 것과 관련된 . 이전을 반환합니다. 가치 관련  (또는 null (만약 하나도 없었다면)
    • 맑은() – 맵에서 모든 키/값 매핑을 제거합니다.
  • 동시 캐시(최대 크기, 액세스 후 만료, 쓰기 후 만료) – 자동 제거 캐시 인스턴스를 생성합니다. 매개변수는 다음과 같습니다.
    • 최대 크기 – 캐시가 보관할 최대 항목 수를 지정하는 (선택 사항) 정수입니다. 이 최대 크기에 도달하면 새 항목을 위한 공간을 확보하기 위해 기존 항목이 제거됩니다. 값은 -1 (기본값)은 최대 크기가 설정되지 않음을 의미합니다.
    • 액세스 후 만료 – 항목의 액세스 "수명"을 밀리초 단위로 지정하는 (선택 사항) 정수입니다. 값의 마지막 액세스 시간과 현재 시간 사이의 시간이 구성된 값을 초과하면 항목이 캐시에서 제거됩니다. -1 (기본값)은 액세스 TTL이 적용되지 않음을 의미합니다.
    • expireAfterWriteMs – 항목의 업데이트 "수명"을 밀리초 단위로 지정하는 (선택 사항) 정수입니다. 값의 마지막 업데이트와 현재 시간 사이의 시간이 구성된 값을 초과하면 항목이 캐시에서 제거됩니다. -1 (기본값)은 업데이트 TTL이 적용되지 않음을 의미합니다.

    인스턴스는 VAIL을 준수합니다. Map 유형 및 지원되는 모든 절차를 지원합니다. Concurrent.Map(). 또한 다음 절차도 지원합니다(다음 절차를 사용해야 함) 메서드 스타일 호출):

    • notifyOnEviction(주제 이름) – 캐시에서 항목이 제거될 때마다 이벤트를 보내도록 캐시 인스턴스를 구성합니다. 이벤트는 지정된 토픽(값)으로 전송됩니다. null 알림을 비활성화합니다. 이벤트 데이터는 다음 속성을 가진 VAIL 개체입니다.
      •  – 퇴거된 입구의 열쇠
      • 가치 – 퇴거된 항목의 값

    경고: Concurrent Cache 내부에서 예외가 발생하는 경우 compute*() 작업 중인 데이터 블록이 손실될 수 있습니다. 사용하기 전에 모든 값을 검증하고 호출을 방지하세요. exception().

  • 동시 잠금() – 코드 블록에 대한 동시 액세스를 동기화하는 데 사용할 수 있는 잠금 인스턴스를 생성합니다. 이 잠금은 다음 프로시저를 지원합니다(다음 프로시저를 사용해야 함). 메서드 스타일 호출):
    • 동기화(함수) – 단독 잠금을 유지하면서 코드 블록을 실행하는 데 사용됩니다. 기능 매개변수는 어떤 것이든 함수 표현식잠금은 함수가 실행되기 전에 획득되어야 하며 실행이 완료되면 해제됩니다.
  • 동시 값() – 동시 값 저장 데이터 구조의 인스턴스를 생성합니다. 이 인스턴스는 VAIL을 준수합니다. Value 다음 절차를 유형화하고 지원해야 합니다(다음 절차를 사용해야 함) 메서드 스타일 호출):
    • getValue(): 객체 – 현재 저장된 값을 반환합니다.
    • getValueOrDefault(기본값 객체): 객체 – 현재 저장된 값을 반환합니다. 현재 저장된 값이 null (일명 설정되지 않음) 그런 다음 defaultValue 대신 반환됩니다.
    • setValue(값 객체): 객체 – 저장된 것을 설정합니다 가치 주어진 것에. 저장된 것을 반환합니다. 가치.
    • updateAndGet(updateFunction): 객체 – 저장된 값을 업데이트하고 결과를 반환합니다. 업데이트 함수 ~이어야합니다. 함수 표현식 형태 : (value) => { <VAIL statements>* }. 그만큼 업데이트 함수 저장될 값을 반환해야 합니다. 저장된 결과 값을 반환합니다.
    • getAndUpdate(updateFunction): 객체 – 저장된 값을 업데이트하고 업데이트 전 값을 반환합니다. 업데이트 함수 ~이어야합니다. 함수 표현식 형태 : (value) => { <VAIL statements>* }. 그만큼 업데이트 함수 저장될 값을 반환해야 합니다. 업데이트 전에 저장된 값을 반환합니다.

문맥

The 문맥 이 서비스는 현재 실행 컨텍스트에 대한 액세스를 제공하는 프로시저 모음을 포함합니다. 이 서비스는 다음과 같은 프로시저를 포함합니다.

  • 컨텍스트.인증 제공자() – ID 공급자의 이름을 반환합니다. 시스템이 내부 ID 및 인증 공급자를 사용하는 경우 반환 값은 "Vantiq"입니다.
  • 컨텍스트.빌드정보() – 반환합니다 Object Vantiq 서버의 빌드 버전, 날짜 및 커밋 SHA가 포함되어 있습니다.
  • 컨텍스트.이메일() – 이메일 주소를 반환합니다( String) 실행이 수행되는 사용자의 이메일 주소입니다. 사용자에게 이메일 주소가 없는 경우 값은 다음과 같습니다. null.
  • 컨텍스트.isEmailVerified() – 다음을 반환합니다. Boolean 사용자의 이메일 주소가 권한 부여 공급자에 의해 검증되었는지 여부를 나타내는 값입니다. 이 값은 OAuth를 사용하여 권한을 부여할 때만 존재합니다.
  • 컨텍스트.isInternalAuth() – 시스템이 내장된 ID 관리 및 인증을 사용하는 경우 true를 반환합니다. false 시스템이 Keycloak과 같은 외부 ID 공급자를 사용하는 경우.
  • Context.isPartitionKeyOwner(파티션키 필요) – 반환 true 호출자가 주어진 것을 "소유"하는 컨텍스트에서 실행 중인 경우 파티션키이 절차는 다음에서 호출되도록 설계되었습니다. 다중 파티션 절차 또는 분할된 상태 초기화 프로그램서비스 외부에서 사용하는 것은 불법입니다.
  • 컨텍스트.라이센스정보() – Vantiq 서버 라이선스를 클레임 세트로 반환합니다. 만료 시간(exp 청구) 및 발급 시간(iat 청구) 날짜를 초로 표현합니다. 시대라이선스 정보는 시스템 관리자 사용자만 접근할 수 있습니다.
  • 컨텍스트.네임스페이스() – 현재 실행이 발생하는 네임스페이스를 문자열로 반환합니다.
  • 컨텍스트.선호하는 사용자 이름() – 선호하는 사용자 이름을 반환합니다. String) 실행이 발생하는 사용자의. preferredUsername 사용자가 가장 일반적으로 알려진 이름을 포함합니다.
  • 컨텍스트.profiles() – 현재 실행 컨텍스트가 모든 작업의 ​​권한을 부여하는 데 사용하는 프로파일을 반환합니다. 이는 문자열 배열이며, 배열의 각 항목은 네임스페이스 접두사가 붙은(정규화된) 프로파일 이름입니다.
  • 컨텍스트.serverUri() – 현재 실행이 발생하는 로컬 서버의 URI를 반환합니다.
  • 컨텍스트.사용자 이름() – 사용자 이름을 반환합니다( String) 실행이 발생하는 사용자의. 사용자 이름 는 리소스 ID입니다. 사용자 리소스입니다. 안정성과 고유성이 보장되지만, 반드시 사용자 친화적인 것은 아닙니다.

대화 기억

The io.vantiq.ai.ConversationMemory 서비스는 이전 요청과 응답이 후속 요청에 대한 컨텍스트를 제공하는 "대화" 관리를 지원합니다. 대화는 배열로 구성됩니다. io.vantiq.ai.ChatMessage 인스턴스. 각 대화에는 불투명한 속성 "백"이 있으며, 이 백에는 항상 다음 시스템 속성이 포함됩니다.

  • ars_namespace – 대화가 속한 네임스페이스
  • ars_createdAt – 대화가 시작된 시점을 나타내는 DateTime 값입니다.
  • ars_createdBy – 대화를 시작한 사용자
  • ars_modifiedAt – 대화가 마지막으로 업데이트된 시점을 나타내는 DateTime 값입니다.
  • ars_modifiedBy – 마지막 수정을 수행한 사용자.

이 서비스는 다음과 같은 절차를 따릅니다.

  • ConversationMemory.startConversation(initialState io.vantiq.ai.ChatMessage 배열, conversationId 문자열, 속성 개체): 문자열 – AI "대화"를 시작합니다. 제공된 경우 대화는 지정된 initialState; 그렇지 않으면 비어 있게 됩니다. 대화가 설정되면 대화의 일부로 발생하는 모든 요청/응답 쌍을 추적합니다(대화 ID를 다음 코드에 전달하여 표시). io.vantiq.ai.SemanticSearch.answer질문 or io.vantiq.ai.LLM.제출 프롬프트 절차). 속성 매개변수를 사용하여 대화의 속성 모음에 사용자 정의 속성을 추가할 수 있습니다. 반환 값은 "대화 ID"라고 하는 불투명한 문자열입니다. 이 값은 호출자가 제공할 수 있으며, 대화를 협업과 같은 기존 리소스와 연결할 때 유용합니다. 그렇지 않으면 시스템에서 자동으로 생성됩니다.
  • ConversationMemory.getConversation(conversationId 문자열 필수): io.vantiq.ai.ChatMessage 배열 – 지정된 대화의 현재 상태를 반환합니다.
  • ConversationMemory.addChatMessages(conversationId 문자열 필수, newMessages io.vantiq.ai.ChatMessage 배열 필수): io.vantiq.ai.ChatMessage 배열 – 대화의 끝에 주어진 새 메시지를 추가합니다.
  • ConversationMemory.setConversation(conversationId 문자열 필수, converationState io.vantiq.ai.ChatMessage 배열 필수) – 지정된 대화의 현재 상태를 주어진 메시지 배열로 설정합니다.
  • ConversationMemory.getConversationProperties(conversationId 문자열 필수): 객체 – 주어진 대화에 대한 속성을 반환합니다.
  • ConversationMemory.updateConversationProperties(conversationId 문자열 필수, 속성 객체 필수, 부울 바꾸기) – 주어진 대화의 속성을 업데이트합니다. 교체 가  true, 그러면 지정된 속성이 기존 속성(시스템 속성 제외)을 대체합니다. 그렇지 않으면 속성이 병합됩니다(기본 설정).
  • ConversationMemory.endConversation(conversationId 문자열 필수) – 주어진 ID로 대화를 종료합니다. 리소스 관리를 위해 대화는 30분 동안 활동이 없으면 자동으로 만료되고 닫힙니다.

이 서비스는 다음과 같은 이벤트를 생성합니다.

  • 대화시작됨 – 새 대화가 시작될 때마다 발생합니다. 이벤트 속성은 다음과 같습니다.
    • conversationId – 시작된 대화의 ID
    • properties – 대화 속성
  • 대화업데이트됨 – 대화가 업데이트될 때 발생합니다. 이벤트 속성은 다음과 같습니다.
    • conversationId – 업데이트된 대화의 ID
    • properties – 대화 속성
    • messageCount – 대화의 메시지 수
  • 대화종료 – 대화가 종료될 때 발생합니다. 이벤트 속성은 다음과 같습니다.
    • conversationId – 종료된 대화의 ID.

전개

The 전개 이 서비스는 Vantiq IDE에서 구성 배포 도구를 구현하는 데 사용되는 프로시저 모음을 포함합니다. 다음 프로시저를 포함합니다.

  • 배포.deploy(configName, globalId, errorsOnly) – 배포합니다 구성 다음으로 식별되는 인스턴스 구성 이름 구성의 프로비저닝 제약 조건에 의해 대상되는 모든 노드에 적용됩니다. 글로벌아이디 배포 결과를 식별하는 데 사용되며 호출자가 생성한 UUID여야 합니다. 오류만 매개변수, 언제 true, 오류를 제외한 모든 결과를 숨깁니다.
  • 배포.deployPartitions(configName, globalId, errorsOnly) – 배포합니다 배포 구성 다음으로 식별되는 인스턴스 구성 이름 각 파티션의 제약 조건에 의해 타겟이 되는 모든 노드에 적용됩니다. 글로벌아이디 배포 결과를 식별하는 데 사용되며 호출자가 생성한 UUID여야 합니다. 오류만 매개변수, 언제 true, 오류를 제외한 모든 결과를 숨깁니다. 동일한 방법으로 Deployment.deployPartitions를 다시 호출합니다. 글로벌아이디 이전 배포 시도에서 실패한 노드나 새 노드에 동일한 배포를 다시 배포하려고 시도합니다. 글로벌아이디 배포 결과를 쿼리하는 데에도 사용할 수 있습니다. 시스템.배포상태.
  • 배포.undeploy(configName, errorsOnly) – 지정된 모든 아티팩트를 제거하여 배포를 되돌립니다. 구성 인스턴스(식별됨) 구성 이름) 구성의 프로비저닝 제약 조건에 의해 대상되는 노드에서. 오류만 매개변수, 언제 true, 오류를 제외한 모든 결과를 숨깁니다.
  • 배포.undeployPartitions(configName, errorsOnly) – 지정된 모든 아티팩트를 제거하여 배포를 되돌립니다. 배포 구성 인스턴스(식별됨) 구성 이름) 각 파티션의 제약 조건이 대상으로 하는 노드에서. 오류만 매개변수, 언제 true, 오류를 제외한 모든 결과를 숨깁니다.

인코딩, 디코딩 및 해싱

The 암호로 바꿔 쓰다디코드   해시 서비스는 외부 소스와 상호 작용하는 데 유용하며, 소스와 상호 작용하기 전이나 상호 작용한 후에 값을 인코딩, 디코딩하고 해시하는 것이 필요한 경우가 많습니다.

  • 인코딩.base64(val) – base64는 지정된 값을 인코딩합니다(다음 중 하나일 수 있음) String 또는 바이트 배열)을 String.
  • 인코딩.formUrl(val) – URL 인코딩을 수행합니다(x-www-form-urlencodedVAIL 객체로 표현된 키-값 문자열 쌍 집합의 )입니다. 문자열 값을 반환합니다.
  • 디코드.base64(val) – base64로 인코딩된 것을 디코딩합니다. String 디코딩된 문자열로.
  • 디코드.base64Raw(val) – Decode.base64와 마찬가지로 이 프로시저는 base64로 인코딩된 값을 디코딩합니다. 그러나 Decode.base64Raw 하지 지원 결과를 UTF-8 문자열로 인코딩합니다. 대신 데이터를 원시 바이트로 반환합니다. 이는 인코딩되지 않은 원래 데이터가 UTF-8 문자열이 아닌 경우(예: 이미지) 유용합니다.
  • Decode.formUrl(val) – 키-값 문자열 쌍을 나타내는 URL 인코딩된 문자열을 디코딩하고 해당 키-값 쌍 세트가 포함된 VAIL 객체를 반환합니다.
  • 해시.sha1(val) – 해시 a String sha1 알고리즘을 사용합니다. 결과는 다음과 같이 인코딩할 수 있는 바이트 배열입니다. 암호로 바꿔 쓰다 서비스 또는 캐스팅할 수 있습니다 String 과 .toString().
  • 해시.sha256(val) – 해시 a String sha256 알고리즘을 사용합니다. 결과는 다음과 같이 인코딩할 수 있는 바이트 배열입니다. 암호로 바꿔 쓰다 서비스 또는 캐스팅할 수 있습니다 String 과 .toString().
  • 해시.sha384(val) – 해시 a String sha384 알고리즘을 사용합니다. 결과는 다음과 같이 인코딩할 수 있는 바이트 배열입니다. 암호로 바꿔 쓰다 서비스 또는 캐스팅할 수 있습니다 String 과 .toString().
  • 해시.sha512(val) – 해시 a String sha512 알고리즘을 사용합니다. 결과는 다음과 같이 인코딩할 수 있는 바이트 배열입니다. 암호로 바꿔 쓰다 서비스 또는 캐스팅할 수 있습니다 String 과 .toString().
  • 해시.md5(값) – 해시 a String md5 알고리즘을 사용합니다. 결과는 다음과 같이 인코딩할 수 있는 바이트 배열입니다. 암호로 바꿔 쓰다 서비스 또는 캐스팅할 수 있습니다 String 과 .toString().
  • Hash.hmacSha1(키, 값) – 해시 a String hmac-sha1 알고리즘을 사용하고 지정됨  이는 다음 중 하나일 수 있습니다. String 또는 바이트 배열입니다. 결과는 다음으로 인코딩할 수 있는 바이트 배열입니다. 암호로 바꿔 쓰다 서비스 또는 캐스팅할 수 있습니다 String 과 .toString().
  • Hash.hmacSha256(키, 값) – 해시 a String hmac-sha256 알고리즘을 사용하고 지정됨  이는 다음 중 하나일 수 있습니다. String 또는 바이트 배열입니다. 결과는 다음으로 인코딩할 수 있는 바이트 배열입니다. 암호로 바꿔 쓰다 서비스 또는 캐스팅할 수 있습니다 String 과 .toString().
  • Hash.hmacSha512(키, 값) – 해시 a String hmac-sha512 알고리즘을 사용하고 지정됨  이는 다음 중 하나일 수 있습니다. String 또는 바이트 배열입니다. 결과는 다음으로 인코딩할 수 있는 바이트 배열입니다. 암호로 바꿔 쓰다 서비스 또는 캐스팅할 수 있습니다 String 과 .toString().

이벤트 처리

규칙이 처리할 때 신뢰할 수 있는 이벤트 규칙은 이벤트 처리를 확인해야 합니다. 그렇지 않으면 신뢰할 수 있는 메시징 시스템이 이벤트를 계속 재전송하여 중복된 규칙 실행으로 이어질 수 있습니다. 규칙에서 이벤트 수신을 확인하려면 기본 제공 ack 프로시저를 사용합니다. 이벤트가 재전송되는지 확인하려면 기본 제공 isRedelivered 프로시저를 사용합니다.

  • 이벤트.ack() – 트리거 이벤트 수신을 확인하는 이벤트를 전송합니다. 신뢰할 수 없는 리소스에서 트리거된 규칙에서 호출되는 경우 아무 작업도 수행되지 않습니다.
  • 이벤트.재전송됨() – 이벤트가 재전송되는 경우 true를 반환합니다.
  • 이벤트.reply(응답 필수): Boolean – 호출자에게 응답을 보냅니다. 이벤트.요청 현재 이벤트를 트리거한 이벤트입니다. 현재 이벤트가 다음을 통해 트리거되지 않은 경우 이벤트.요청 그러면 이것은 no-op입니다. 반환 값은 다음과 같습니다. true 응답이 전송되었음을 나타냅니다.
  • Event.request(serviceEventName 문자열 필수, 데이터 임의 필수, timeout 정수): 임의 – 명명된 것을 트리거합니다 봉사 행사 그리고 응답이 전송될 때까지 기다립니다. 이벤트.답변. 이것은 오직 다음에서만 호출될 수 있습니다. 서비스 절차. 선택 사항 시간 제한 값은 호출자가 응답을 기다리는 시간을 정의하는 밀리초 단위의 간격입니다. 기본적으로 호출자는 무기한 대기합니다. 호출 시간이 초과되면 오류 코드와 함께 예외가 생성됩니다. io.vantiq.rulemgr.execution.callback.timeout반환 값은 다음에 의해 제공된 응답입니다. 이벤트.답변.

이미지 처리

에 설명 된대로 이미지 섹션 리소스 가이드의 영상 리소스는 Vantiq 데이터베이스에 이미지를 저장할 수 있습니다. 이러한 서비스 사용에 대한 자세한 내용은 다음을 참조하세요. 이미지 처리 가이드.

이미지 처리를 위해 제공되는 서비스는 두 가지가 있습니다. 비전스크립트빌더   비전스크립트운영.

비전스크립트빌더

VisionScriptBuilder 서비스는 VisionScript 객체를 쉽게 구성하는 방법을 제공합니다.

  • VisionScriptBuilder.newScript(스크립트 이름) – 지정된 이름으로 새로운 스크립트 객체를 생성하여 반환합니다.
  • VisionScriptBuilder.addAction(스크립트, 액션) – 지정된 것을 추가합니다 동작 부터 스크립트새로운 스크립트를 반환합니다.
  • VisionScriptBuilder.addConvertToGrayScaleAction(스크립트) – 이미지를 회색조로 변환하는 작업을 추가합니다( 흑백으로) 새로운 스크립트를 반환합니다.
  • VisionScriptBuilder.addCropAction(스크립트, x, y, 너비, 높이) – x, y 좌표를 기반으로 지정된 높이 및 너비로 이미지를 자르고 새 스크립트를 반환하는 동작을 추가합니다.
  • VisionScriptBuilder.addDrawBoxesAction(스크립트, 상자 목록) – 지정된 대로 상자를 그리는 작업을 추가합니다. 박스리스트 매개변수를 사용하여 새로운 스크립트를 반환합니다.
  • VisionScriptBuilder.addBoxToList(boxList, x, y, 너비, 높이, 두께, 색상, 레이블, 레이블 세부 정보) – 목록에 상자를 추가합니다. 목록이 null, 목록을 생성합니다. 새 목록을 반환합니다.
    • x - Integer 상자의 왼쪽 위 모서리의 X 좌표
    • y - Integer 상자 왼쪽 상단 모서리의 Y 좌표
    • width - Integer X 좌표에서 측정한 (오른쪽) 상자 너비
    • height - Integer 상자 높이, Y 좌표에서 (아래로) 측정
    • thickness – 옵션 Integer 선의 두께입니다. 값이 없으면 기본값은 2입니다.
    • color – 옵션 Object 3 개 포함 Integer 속성(값 0~255): 빨간색, 초록색, 파란색. 예: { 빨간색: 128, 초록색: 128, 파란색: 128 }. 없으면 빨간색이 기본값입니다.
    • label – 옵션 String 상자에 라벨을 붙일 것
    • labelDetails – 선택 사항 textDetail(참조 VisionScriptBuilder.newTextDetails()) 라벨용
  • VisionScriptBuilder.addDrawBoxesFromPreviousAction(스크립트, actionId) – 이전 작업의 결과를 사용하여 boxList를 생성하고 반환합니다(현재는 VisionScriptBuilder.findFaces() 행동).
    • actionId - String 식별 tagName 이전 동작에 사용됨.
  • VisionScriptBuilder.newBoxListFromYOLOResult(yoloResult, 두께, 색상, 레이블 세부 정보) – 신경망(특히 YOLO 모델)이 이미지를 해석한 결과로부터 상자 목록을 생성하고 반환합니다. YOLO 모델은 이미지를 해석하고, 모델의 학습 결과를 기반으로 이미지 내 객체를 식별합니다. 모델로부터 객체의 이름과 위치를 얻습니다. 이 절차는 각 상자에 객체 이름이 레이블된 상자 목록을 생성합니다.
    • yoloResult - 결과 Object YOLO TensorFlow 실행에서
    • thickness – 옵션 Integer 상자를 둘러싼 선의 두께 지정
    • colors – 옵션 Object Array 사용할 색상을 설명합니다. 기본값은 RED이며, 빈 색상 목록은 색상이 제공되지 않은 것처럼 처리됩니다( 빨간색).
    • labelDetails – 옵션 Object 레이블의 텍스트 속성 설명(참조 VisionScriptBuilder.newTextDetails()).
  • VisionScriptBuilder.addDrawTextAction(스크립트, 텍스트, x, y, 세부 정보) – 지정된 위치에 지정된 텍스트를 그리는 동작을 추가하고 새 스크립트를 반환합니다.
    • script – 비전스크립트 Object 동작을 추가할 위치
    • text - String 이미지에 추가될 가치
    • x - Integer 추가할 텍스트의 왼쪽 상단의 X 값
    • y - Integer 추가할 텍스트의 왼쪽 상단 Y 값
    • details – 옵션 Object 추가할 텍스트의 프레젠테이션 세부 사항을 설명합니다(참조 VisionScriptBuilder.newTextDetails()).
  • VisionScriptBuilder.newTextDetails(글꼴, 기울임꼴, 두께, 글꼴 크기, 색상) – 생성하고 반환합니다. Object 다른 작업에 사용되는 텍스트에 대한 텍스트 세부 정보를 포함합니다. VisionScriptBuilder.addBoxToList()VisionScriptBuilder.newBoxListFromYOLOResult()글렌데일 VisionScriptBuilder.addDrawTextAction().
    • font - String 텍스트에 사용할 글꼴의 이름을 지정합니다. 글꼴 선택은 기본 플랫폼에 따라 결정되며, 다음과 같습니다.
      • HERSHEY_PLAIN,
      • HERSHEY_COMPLEX,
      • HERSHEY_TRIPLEX (이탤릭체는 무시됨)
      • HERSHEY_SIMPLEX,
      • HERSHEY_DUPLEX,
      • HERSHEY_COMPLEX_SMALL,
      • HERSHEY_SCRIPT_SIMPLEX,
      • HERSHEY_SCRIPT_COMPLEX
    • italicize - Boolean 텍스트를 기울임체로 표시할지 여부를 나타냅니다(가능한 경우)
    • thickness - Integer 텍스트의 픽셀 단위 두께
    • fontScale - Real 텍스트를 확장할 숫자
    • color - Object 3 개 포함 Integer 속성(값 0~255): 빨간색, 초록색, 파란색. 예: { 빨간색: 128, 초록색: 128, 파란색: 128 }. 이 속성이 없으면 빨간색({red: 255, green: 0, blue: 0}).
  • VisionScriptBuilder.addResizeAction(스크립트, 너비, 높이) – 스크립트에 크기 조정 동작을 추가하여 새 스크립트를 반환합니다. 이미지는 지정된 대로 크기가 조정됩니다. width   height 매개 변수를 설정합니다.
  • VisionScriptBuilder.addSaveAction(스크립트, 이미지 이름, 이미지 유형) – 스크립트의 현재 결과를 저장하는 작업을 추가합니다. imageName 를 사용하여 imageType 저장할 유형을 지정하려면 다음을 수행합니다. imageName or imageType 누락된 경우 현재 이미지와 동일한 값으로 기본 설정됩니다. (참조 VisionScriptOperation.processImage() 이하.)

각 최상위 빌더는 새 스크립트를 반환합니다. 다음 예제에서는 이미지를 흑백으로 변환하고 해당 이미지에서 얼굴을 찾는 작업 목록을 생성하는 프로시저를 빌드합니다.

PROCEDURE VisionScriptTest.genActionScript1(scriptName String)
var as1 = VisionScriptBuilder.newScript(scriptName)
    as1 = VisionScriptBuilder.addConvertToGrayscaleAction(as1)
    as1 = VisionScriptBuilder.addFindFacesAction(as1)

return as1

두 번째 예에서는 발견된 얼굴을 둘러싼 이미지에 상자를 그리는 프로시저를 만듭니다.

PROCEDURE createFaceBoxer()
var as1 = VisionScriptBuilder.newScript("FaceBoxer")
    as1 = VisionScriptBuilder.addConvertToGrayscaleAction(as1)
    as1 = VisionScriptBuilder.addFindFacesAction(as1)
    as1 = VisionScriptBuilder.addDrawBoxesFromPreviousAction(as1, "findFaces")  // Use results from findFaces action
    as1 = VisionScriptBuilder.addSaveAction(as1, null, "image/jpeg")
return as1

비전스크립트운영

The 비전스크립트운영 서비스는 비전 스크립트(예: 다음에 의해 작성된 스크립트)를 실행하는 데 사용되는 절차를 제공합니다. 비전스크립트빌더 서비스).

  • VisionScriptOperation.processImage(이미지, 스크립트) – 지정된 이미지에 대해 스크립트를 실행합니다.
    • image - String 스크립트가 실행될 이미지의 이름을 포함합니다.
    • script - Object 실행할 스크립트가 포함되어 있음

예를 들어, 다음을 사용하여 createFaceBoxer 이전 섹션의 절차를 다음과 같이 "familyWedding.jpg"라는 이미지에 대해 실행할 수 있습니다.

   var faceBoxerScript = createFaceBoxer()
   VisionScriptOperation.processImage("familyWedding.jpg", faceBoxerScript)

이 코드 조각을 실행하면 "familyWedding.jpg" 이미지가 얼굴이 상자로 표시된 흑백 이미지로 대체됩니다.

예를 들어 사용법은 다음을 참조하세요. 샘플 코드 인간을 이미지 처리 가이드.

JWT 절차

The JWT 서비스에는 Json 웹 토큰(JWT)을 생성하고 디코딩하는 프로시저 컬렉션이 포함되어 있습니다(참조 jwt.io   RFC 7519). 이를 통해 JWT 서명 처리에 대칭(HMAC), RSA 및 타원형 키를 사용할 수 있습니다. 아래 호출 전체에서 다음이 서명 알고리즘으로 지원됩니다.

암호알고리즘 JWS 알고리즘 기술설명
HMAC256 HS256 SHA-256을 사용한 HMAC
HMAC384 HS284 SHA-384을 사용한 HMAC
HMAC512 HS512 SHA-512을 사용한 HMAC
RSA256 RS256 SHA-1을 사용한 RSASSA-PKCS1-v5_256
RSA384 RS384 SHA-1을 사용한 RSASSA-PKCS1-v5_384
RSA512 RS512 SHA-1을 사용한 RSASSA-PKCS1-v5_512
ECDSA256 ES256 P-256 및 SHA-256 곡선을 사용한 ECDSA
ECDSA256 ES256K 곡선 P-256k1 및 SHA-256을 사용한 ECDSA
ECDSA384 ES384 P-384 및 SHA-384 곡선을 사용한 ECDSA
ECDSA512 ES512 P-521 및 SHA-512 곡선을 사용한 ECDSA
서명되지 않은 없음 JWT는 서명되지 않았습니다

상위 수준에서 HMAC/HS 값은 대칭 키를 지정하고, RSA/RS 값은 RSA 키를 사용하며, EC/ES는 타원형 키를 사용합니다. VAIL은 키 생성 지원을 제공하지 않습니다.

위 표에서 JWS alg(Json 웹 서명 alg) 열에는 아래 호출에 대한 서명 알고리즘 매개변수로 사용될 값이 포함되어 있습니다.

Vantiq 시스템에서 서명 및 검증 키(아래 참조)는 항상 문자열 값입니다. HMAC/HS 키의 경우, 이는 키의 문자열 값입니다. RSA/RS 및 ECDSA/ES 알고리즘의 경우, 값은 Base64로 인코딩된 값입니다. 이는 직접 전달된 키와 Vantiq 리소스에서 제공된 키 모두에 적용됩니다.

다음 호출에서 RSA/RS 및 ECDSA/ES 알고리즘에 제공된 서명 키는 다음과 같습니다. 사설 키; 확인을 위해 다음을 제공하세요. 공개 키. HMAC/HS 알고리즘의 경우 대칭 키는 하나만 있습니다.

  • JWT.createToken(signingAlgorithm, claims, signingKey) – 지정된 클레임을 포함하는 서명된 JWT가 들어 있는 문자열을 반환합니다.
    • signingAlgorithm – JWT 생성에 사용할 서명 알고리즘의 이름을 포함하는 문자열입니다. 이름은 다음에서 가져와야 합니다. JWS 알고리즘 위의 열.
    • claims – JWT에 포함될 클레임을 포함하는 VAIL 객체입니다. 키는 클레임 ​​이름을, 값은 클레임 값을 나타냅니다.
    • signingKey – JWT 서명에 사용할 키 값을 포함하는 문자열입니다. 사설 (적절한 경우) 키는 위에 지정된 대로 문자열로 변환됩니다.
  • JWT.createTokenWithHeaders(headers, claims, signingKey) – 지정된 클레임을 포함하는 서명된 JWT가 들어 있는 문자열을 반환합니다.
    • headers – JWT에 포함할 헤더를 포함하는 VAIL 객체입니다. 키는 헤더 이름을, 값은 헤더 값을 나타냅니다. 헤더 MUST 를 포함 alg 헤더에는 JWT 생성에 사용할 서명 알고리즘의 이름이 포함되어야 합니다. 이름은 다음에서 가져와야 합니다. JWS 알고리즘 위의 열.
    • claims – JWT에 포함될 클레임을 포함하는 VAIL 객체입니다. 키는 클레임 ​​이름을, 값은 클레임 값을 나타냅니다.
    • signingKey – JWT 서명에 사용할 키 값을 포함하는 문자열 사설 (적절한 경우) 키는 위에 지정된 대로 문자열로 변환됩니다.
  • JWT.createTokenUsingResource(signingAlgorithm, claims, resource, resourceId) – 지정된 클레임을 포함하는 서명된 JWT가 들어 있는 문자열을 반환합니다.
    • signingAlgorithm – JWT 생성에 사용할 서명 알고리즘의 이름을 포함하는 문자열입니다. 이름은 다음에서 가져와야 합니다. JWS 알고리즘 위의 열.
    • claims – JWT에 포함될 클레임을 포함하는 VAIL 객체입니다. 키는 클레임 ​​이름을, 값은 클레임 값을 나타냅니다.
    • resource – 키가 포함된 Vantiq 리소스 유형의 이름을 포함하는 문자열입니다. system.documents   system.secrets 리소스가 지원됩니다.
    • resourceId – 키로 사용할 문서 또는 비밀번호의 이름입니다. 이 명명된 리소스에는 위에 지정된 대로 키의 문자열 값이 포함되어야 합니다.
  • JWT.createTokenWithHeadersUsingResource(headers, claims, resource, resourceId) – 지정된 클레임을 포함하는 서명된 JWT가 들어 있는 문자열을 반환합니다.
    • headers – JWT에 포함할 헤더입니다. 키는 헤더 이름을, 값은 헤더 값을 나타냅니다. 헤더 MUST 를 포함 alg 헤더에는 JWT 생성에 사용할 서명 알고리즘의 이름이 포함되어야 합니다. 이름은 다음에서 가져와야 합니다. JWS 알고리즘 위의 열.
    • claims – JWT에 포함될 클레임을 포함하는 VAIL 객체입니다. 키는 클레임 ​​이름을, 값은 클레임 값을 나타냅니다.
    • resource – 키가 포함된 Vantiq 리소스 유형의 이름을 포함하는 문자열입니다. system.documents   system.secrets 리소스가 지원됩니다.
    • resourceId – 키로 사용할 문서 또는 비밀번호의 이름입니다. 이 명명된 리소스에는 위에 지정된 대로 키의 문자열 값이 포함되어야 합니다.
  • JWT.decodeAndVerifyToken – 디코딩된 JWT를 포함하는 VAIL 객체를 반환합니다. 선택적으로 JWT가 검증되었는지 여부를 나타내는 정보가 포함됩니다.
    • token – 디코딩할 JWT를 포함하는 문자열입니다.
    • verificationKey – (선택 사항) JWT 서명 확인에 사용할 키가 포함된 문자열입니다. 공개 (적절한 경우) 키는 위에 지정된 대로 문자열로 변환됩니다. verificationKey 제공되지 않으면 검증이 수행되지 않습니다.
    • 이 프로시저는 다음 속성을 포함하는 VAIL 객체를 반환합니다.
      • headers – JWT에 포함된 헤더
      • claims – JWT에 포함된 클레임
      • verified – 검증이 성공했는지 여부를 나타내는 부울 값입니다. 검증이 요청되지 않은 경우(즉, 아니 verificationKey 제공되었으므로 이 속성은 존재하지 않습니다.
  • JWT.decodeAndVerifyTokenUsingResource – 디코딩된 JWT를 포함하는 VAIL 객체를 반환합니다. 선택적으로 JWT가 검증되었는지 여부를 나타내는 정보가 포함됩니다.
    • token – 디코딩할 JWT를 포함하는 문자열입니다.
    • resource – 키가 포함된 Vantiq 리소스 유형의 이름을 포함하는 문자열입니다. system.documents   system.secrets 리소스가 지원됩니다.
    • resourceId – 키로 사용할 문서 또는 비밀번호의 이름입니다. 이 명명된 리소스에는 문자열 값이 포함되어야 합니다. 공개 (적절한 경우) 위에 지정된 대로 키를 누릅니다.
    • 이 프로시저는 다음 속성을 포함하는 VAIL 객체를 반환합니다.
      • headers – JWT에 포함된 헤더
      • claims – JWT에 포함된 클레임
      • verified – 검증이 성공했는지 여부를 나타내는 부울 값입니다.

예를 들어, HMAC256 서명 알고리즘을 사용하여 JWT를 생성하고 싶다고 가정해 보겠습니다. 이를 위해 다음과 같은 작업을 수행할 수 있습니다.

var jwt = JWT.createToken("HS256",
                        { iss: "http://example.com", "http://example.com/name" : "fred" },
                         "mySecret")

이렇게 하면 다음과 같은 문자열이 생성됩니다.

0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vZmhjYXJ0ZXIuY29tIiwic29tZXRoaW5nIjoiZWxzZSJ9.T9Wx1TWUZzzP8JYs1LeW0JoP0vQZpdQvhox4cWZP5g8

이러한 토큰을 디코딩하고 확인하려면 다음을 사용하세요.

var jwtDecoded = JWT.decodeAndVerifyToken(jwt, "mySecret")

다음 값을 포함하는 객체가 반환됩니다.

{
    headers: {
        typ: "JWT",
        alg: "HS256"
    },
    claims: { 
        iss: "https://example.com",
        "http://example.com/name" : "fred"
    },
    verified: true
}

이러한 토큰을 디코딩하지만 검증하지 않으려면 다음을 사용하세요.

var jwtDecoded = JWT.decodeAndVerifyToken(jwt)

다음 값을 포함하는 객체가 반환됩니다.

{
    headers: {
        typ: "JWT",
        alg: "HS256"
    },
    claims: { 
        iss: "https://example.com",
        "http://example.com/name" : "fred"
    }
}

LLM

The io.vantiq.ai.LLM 이 서비스는 대규모 언어 모델(LLM)과 상호 작용하는 데 사용되는 메서드를 제공합니다. Vantiq는 다음과 같은 생성 LLM에 대한 지원을 미리 구성했습니다. GPT-4   GPT-3.5.

  • LLM.submitPrompt(llmName 문자열, prompt, conversationId 문자열, responseProperties 객체, 함수, runtimeConfig, functionAuthorizer, 도구) – 지정된 프롬프트를 지정된 대상에 제출합니다. LLM 생성된 응답을 반환합니다. 일반적으로 이 응답은 String 이는 LLM에 의해 합성됩니다. 인수는 다음과 같습니다.
    • llm이름 – 대상 LLM의 이름입니다. 이는 다음을 참조해야 합니다. 생성적인 법학 석사
    • 신속한 – LLM에 제출하라는 메시지입니다. 이는 다음 중 하나여야 합니다. String 또는 io.vantiq.ai.ChatMessage 정렬.
    • 대화ID – 제공된 경우 프롬프트 제출을 이전에 설정된 "대화"와 연결합니다(참조 대화 기억). 현재 대화 상태는 제공된 프롬프트와 함께 제출되고, 프롬프트와 그에 따른 LLM 응답은 대화에 추가됩니다.
    • 응답 속성 – 첨부할 선택적 속성 ChatMessage 활성 대화에 LLM이 추가될 때 LLM의 응답을 나타내는 인스턴스(대화가 없으면 값은 무시됨).
    • 기능 - (사용되지 않는참조 tools 매개변수) AI 함수 설명자의 선택적 배열입니다.
    • 런타임 구성 – LLM 구성 설정을 지정하는 선택적 개체 submitPrompt 호출. 지정된 경우, 런타임 구성 LLM 구성과 병합되어 해당 구성 속성을 재정의합니다. 병합된 구성은 다음에 사용됩니다. submitPrompt 호출; LLM 구성 자체는 변경되지 않습니다. 예를 들어, 이 인수는 다음을 지정하는 데 사용할 수 있습니다. temperature or max_tokens 특정 값 submitPrompt 기도.
    • 함수 승인자 – 함수 호출의 자동 실행을 허용할지 거부할지 여부를 결정하는 프로시저에 대한 선택적 참조(기능 위의 매개변수). functionAuthorizer가 제공되지 않으면 함수 실행은 자동으로 이루어집니다. functionAuthorizer가 제공된 경우, functionAuthorizer는 다음을 반환해야 합니다. 참된 집행을 허가하고 그릇된 거부합니다. functionAuthorizer 프로시저에는 다음 매개변수가 있어야 합니다.
      • name – 실행할 함수의 이름
      • 인수 – 함수 호출 매개변수 값

       LLM 참조 가이드 자세한 내용은.

    • 검색을 – AI 도구 설명자의 선택적 배열입니다. 이러한 설명자는 다음 인스턴스일 수 있습니다. io.vantiq.ai.FunctionDescriptor 스키마 유형 또는 VAIL을 참조하는 ResourceReference 인스턴스 서비스 or 순서. 지정된 경우, 제공된 프롬프트와 함께 LLM에 제공됩니다. LLM은 주어진 프롬프트에 응답하는 데 필요한 컨텍스트를 얻기 위해 도구 호출을 요청할 수 있습니다. 서비스 또는 프로시저를 참조할 경우 이 호출은 자동으로 처리됩니다. 도구를 스키마로 설명할 경우(예: io.vantiq.ai.FunctionDescriptor) 도구를 호출할 수 없습니다. submitPrompt 인스턴스를 반환합니다 io.vantiq.ai.ChatMessage 도구를 호출하라는 요청을 나타냅니다. 설명 프로시저에 대한 설명이 있는 경우, LLM은 해당 설명을 사용하여 호출할 프로시저를 결정합니다. ResourceReference의 경우, 서비스 인터페이스와 프로시저 모두에 프로시저에 대한 설명이 정의된 경우, 해당 프로시저의 설명이 사용됩니다. 다음을 참조하십시오. LLM 참조 가이드 예를 들어.
  • LLM.submitPromptAsSequence(llmName 문자열, 프롬프트, conversationId 문자열, responseProperties 객체, 함수, runtimeConfig, functionAuthorizer, 도구) – 지정된 프롬프트를 지정된 대상에 제출합니다. LLM 생성된 응답을 다음과 같이 반환합니다. 순서. 이는 출력이 생성될 때 호출자에게 출력을 스트리밍하는 데 사용됩니다. 매개변수 정의는 다음 매개변수 정의와 동일합니다. 제출 프롬프트.

이것은 내장된 절차이므로 다음의 일부로 사용할 수 없습니다. 실행 진술. 따라서 결과는 다음을 사용하여 처리해야 합니다. 되풀이 성명서.

위치추적

The 위치추적 이 서비스는 Vantiq 모바일 앱에서 위치 추적을 구현하는 데 사용되는 절차 모음을 포함합니다. 이 서비스에는 다음 절차가 포함됩니다.

  • LocationTracking.trackCollaborator(활동, 사용자, 레벨, 거리필터, 원하는 정확도, 목적지, 목적지반경, 도착주제, 보고주제) – 추적을 시작합니다 사용자 지정된에 목적지 특정 활동 협업 유형으로. 거리 필터원하는 정확도글렌데일 목적지 반경 모두 Real 보고 빈도, 측정 정확도, 도착 이벤트를 트리거하기 위해 사용자가 목적지에 얼마나 가까이 있어야 하는지 등을 조정하기 위해 조정할 수 있는 숫자입니다. 보고주제 Vantiq 모바일 앱에서 위치 업데이트가 게시되는 위치입니다. 도착주제 위치 도착 이벤트가 게시되는 곳입니다.
  • LocationTracking.untrackCollaborator(활성, 사용자) – 제거하다 ArsActiveTrack 기록 활동적인 그리고 추적을 중지합니다 사용자 해당 활동에 대해서만 가능합니다. 사용자를 추적하는 다른 활동이 있을 수 있으며, 이 경우 위치 추적이 완전히 꺼지지 않을 수 있습니다.

연산

수학 서비스에는 규칙 및 절차에 사용할 수 있는 기본 수학 함수 모음이 포함되어 있습니다. 다음 절차가 포함됩니다.

  • 수학.abs(값) – val의 절대값을 반환합니다.
  • 수학.ceil(값) – 가장 가까운 값으로 반올림하여 값을 반환합니다. Integer.
  • 수학.exp(값) – E^val을 반환합니다(여기서 E는 자연로그의 밑입니다).
  • 수학.floor(val) – 가장 가까운 값으로 반올림하여 val을 반환합니다. Integer.
  • 수학.log(값) – val의 자연로그를 반환합니다.
  • 수학.log2(값) – val의 밑이 2인 로그를 반환합니다.
  • 수학.log10(값) – val의 밑이 10인 로그를 반환합니다.
  • 수학.max(x,y) – 숫자 x와 y의 최댓값을 반환합니다. x와 y는 동일한 유형의 숫자여야 하므로 x가 Real, y도 또한 a여야 합니다. Real.
  • 수학.min(x,y) – 숫자 x와 y의 최소값을 반환합니다. x와 y는 동일한 유형의 숫자여야 하므로 x가 Real, y도 또한 a여야 합니다. Real.
  • 수학.round(값) – 가장 가까운 값으로 반올림된 값을 반환합니다. Integer반환된 값은 다음과 같습니다. Real.
  • 수학.sqrt(값) – val의 제곱근을 반환합니다.
  • 수학.난수(최소값, 최대값) – 무작위를 반환합니다 Integer 최소값(포함)과 최대값(포함) 사이입니다.
  • 수학.randomReal() – 무작위를 반환합니다 Real 0(포함)과 1(제외) 사이.

사용 가능한 삼각 함수(참고: 모든 입력 값은 라디안 단위여야 함):

  • 수학.cos(값) – val의 코사인을 반환합니다.
  • 수학.sin(값) – val의 사인을 반환합니다.
  • 수학.tan(val) – 각도 val의 탄젠트를 반환합니다.
  • 수학.acos(val) – val의 아크코사인을 반환합니다.
  • 수학.asin(val) – val의 아크사인을 반환합니다.
  • Math.atan(val) – val의 아크탄젠트를 반환합니다. 참고: 결과는 항상 [-PI/2,PI/2] 범위에 있습니다.
  • 수학.atan2(y,x) – y/x의 아크탄젠트를 반환합니다. 참고: y 좌표는 첫 번째 인수이고 x 좌표는 두 번째 인수입니다.

표준 상수 집합은 매개변수 없는 프로시저로 구현되었습니다.

  • 수학.E() – 자연로그의 밑(약 2.718)인 오일러 수를 반환합니다.
  • 수학.LN2() – 2의 자연로그(약 0.693)를 반환합니다.
  • 수학.LN10() – 10의 자연로그(약 2.302)를 반환합니다.
  • 수학.LOG2E() – E의 밑이 2인 로그(약 1.442)를 반환합니다.
  • 수학.LOG10E() – E의 밑이 10인 로그(약 0.434)를 반환합니다.
  • 수학.PI() – 파이(약 3.14)를 반환합니다.
  • 수학.SQRT2() – 2의 제곱근(약 1.414)을 반환합니다.
  • 수학.SQRT1_2() – 1/2의 제곱근(약 0.707)을 반환합니다.

모션 트래킹

The 모션트래킹 이 서비스는 이미지 내 개체의 움직임을 추적하고 이해하는 데 사용되는 일련의 절차를 포함합니다. 다음과 같은 절차가 포함됩니다.

  • MotionTracking.trackMotion(상태, 새 객체, 알고리즘, 자격, 최대 부재, 관찰 시간, 좌표 속성, 레이블 속성) – 반환합니다 Object 다음 속성을 사용합니다. 추적된 객체 새로운 객체 위치와 삭제된 객체 이 호출 후 삭제된 객체 목록을 포함합니다.
    • 상태 – 현재 추적된 객체 세트입니다. A null 값은 현재 상태를 나타내지 않습니다.
    • 새로운 객체 – 위치를 가진 새로운 객체의 집합입니다.
    • 연산 - 연산 동작을 결정하는 데 사용합니다.
    • 자격 – 두 위치가 일치하는지 확인하는 데 사용되는 값  동일한 개체의 움직임이 됩니다.
    • 최대 결석 – 엔티티가 누락된 것으로 간주되는 간격. 누락된 객체는 알려진 객체 집합에서 삭제됩니다.
    • 관찰 시간 – 새로운 직책에 배정될 시간입니다. 지정하지 않으면 현재 시간을 사용합니다.
    • 좌표 속성 – (선택 사항) 좌표를 가져올 속성의 이름입니다. 기본값은 다음과 같습니다. location입력에 다른 속성 이름으로 위치 정보가 저장되어 있는 경우 이를 사용할 수 있습니다.
    • 라벨 속성 – (선택 사항) 레이블을 추출할 속성의 이름입니다. 기본값은 다음과 같습니다. label. 이는 다른 속성 이름을 사용하여 입력 레이블을 사용하는 데 사용될 수 있습니다.
  • MotionTracking.buildAndPredictPath(상태, 새 객체, 최대 크기, 경로 속성, 좌표 속성, 예측 수행, 예측 시간) – 반환합니다 Object 다음 속성을 사용합니다. 추적된 경로 추적된 객체의 경로와 목록을 포함합니다. 삭제된 경로 예상 위치와 함께 삭제된 경로 목록이 포함된 속성입니다.
    • 상태 – 현재 추적된 경로 세트입니다. A null 값은 현재 상태를 나타내지 않습니다.
    • 새로운 객체 – 위치를 가진 새로운 객체의 집합입니다.
    • 최대 크기 – (선택 사항) 최대 경로 길이입니다. 기본값은 10입니다.
    • 경로 속성 – (선택 사항) 위치 객체 내 경로를 저장하는 데 사용할 속성 이름입니다. 기본값은 다음과 같습니다. trackedPath.
    • 좌표 속성 (선택 사항) 위치 정보를 가져올 속성의 이름입니다. 기본값은 다음과 같습니다. location.
    • 예측 – (선택 사항) Boolean 추적에서 삭제된 객체의 위치를 ​​예측할지 여부를 나타냅니다.
    • 예측 시간 – (선택 사항) 예측 위치에 할당할 시간입니다. 지정하지 않으면 현재 시간을 사용합니다.
  • MotionTracking.findRegionsForCoordinate(지역목록, 좌표) – 좌표가 위치한 지역 이름 목록을 반환합니다. 목록은 비어 있을 수 있습니다.
    • 지역 목록 – Array 의 추적지역 선택할 수 있습니다.
    • 좌표의 – Object 위치 정보를 포함하고 있습니다.
  • MotionTracking.findRegionsForBoundingBox(regionList, boundingBox, overlapPercentage) – 경계 상자가 위치한 지역 이름 목록을 반환합니다. 목록은 비어 있을 수 있습니다.
    • 지역 목록 – Array 의 추적지역 선택할 수 있습니다.
    • 경계 상자 – Object 해당 경계 상자가 포함되어 있습니다.
    • 중복 백분율 – 숫자 (Integer or Real) 영역에 포함되어야 하는 경계 상자의 백분율을 나타냅니다. 주어진 숫자가 1보다 크면 100으로 나누어 소수 백분율을 구합니다. 주어진 숫자가 1보다 작으면 소수 백분율로 간주됩니다. 주어진 숫자는 85보다 커야 합니다. 예를 들어, "XNUMX"가 입력된 경우 overlapPercentage, 경계 상자의 85%(0.85)이 해당 영역에 포함되어야 해당 영역이 경계 상자를 포함하는 것으로 간주됩니다.
  • MotionTracking.computeVelocity(regionList, 경로, lastLegOnly) – 다음 속성을 가진 속도 객체를 반환합니다. 속도 단위/초(지역 단위와 동일) 및 방향 나침반 방향(도 수)으로. 두 속성 중 하나 또는 둘 다 누락될 수 있습니다. 거리 or 방향 구성 요소는 다음에서 발견됩니다. 지역 목록.
    • 지역 목록 – Array of 추적지역 거리와 방향을 수집하는 곳
    • 통로 – 객체의 경로(위치 목록)
    • 마지막 다리만 - Boolean 마지막 두 위치를 사용할지 여부를 나타냅니다. false경로의 첫 번째와 마지막 위치를 사용합니다.
  • MotionTracking.predictPositions(예측 경로, 예측 시간, 경로 속성) – 예상 위치가 포함된 경로 목록을 반환합니다.
    • 예측 경로 – 다음 위치를 예측하기 위한 현재 추적된 경로 세트입니다.
    • 예측 시간 – (선택 사항) 예측 위치에 할당할 시간입니다. 지정하지 않으면 현재 시간을 사용합니다.
    • 경로 속성 – (선택 사항) 위치 객체 내 경로를 저장하는 데 사용할 속성 이름입니다. 기본값은 다음과 같습니다. trackedPath.
  • MotionTracking.predictPositionsBasedOnAge(후보경로, 만료시간, 예측시간, 경로속성) – 만료된 경로와 해당 경로의 예상 위치 목록을 반환합니다. 이 프로시저는 다음을 평가합니다. 후보 경로 에 대한 만료 시간. 마지막 경로의 경우 관찰 시간 ~에 있거나 그 이전입니다 만료 시간, 우리는 다음 위치를 예측합니다(기반 예측 시간) 및 해당 목록을 반환합니다. 이후의 경로 만료 시간 무시됩니다.
    • 후보 경로 – 다음 위치를 예측하기 위한 현재 추적된 경로 세트입니다.
    • 만료 시간 – 만료된 것으로 간주되는 가장 늦은 시간을 나타내는 시간입니다.
    • 예측 시간 – (선택 사항) 예측 위치에 할당할 시간입니다. 지정하지 않으면 현재 시간을 사용합니다.
    • 경로 속성 – (선택 사항) 위치 객체 내 경로를 저장하는 데 사용할 속성 이름입니다. 기본값은 다음과 같습니다. trackedPath.
  • MotionTracking.dbscanCluster(거리, 최소점, 점) – 지정된 거리, minPoints 매개변수, 그리고 [[x1,y1],[x2,y2],…]로 표현된 점 목록을 사용하여 밀도 기반 클러스터링 알고리즘 DBSCAN을 실행합니다. 찾은 클러스터 목록을 반환합니다. 여기서 하나의 클러스터는 해당 클러스터에 속하는 모든 점의 목록입니다. 클러스터를 찾지 못하면 빈 목록을 반환합니다.
    • 거리 – 지점의 ε-이웃을 정의하는 거리입니다.
    • 최소 포인트 – 클러스터를 형성하는 데 필요한 밀도 연결 포인트의 최소 개수입니다.
    • 전철기 – [x,y] 좌표 배열로 표현된 점 목록입니다. 좌표는 정수 또는 실수 값으로 지정할 수 있습니다.

모션트래킹.trackMotion()   모션 추적.buildAndPredictPath() 상태를 유지하는 프로시저입니다. 따라서 해당 프로시저의 반환 값(주어진 호출에서)은 다음과 같아야 합니다. 상태 다음 호출을 위한 매개변수입니다. MotionTracking.findRegionsForBoundingBox()모션 추적.좌표에 대한 지역 찾기()글렌데일 모션트래킹.computeVelocity() 단순히 정보 제공용일 뿐이며 상태를 유지하지 않습니다.

제공된 경로 목록 모션 추적.buildAndPredictPath() 호출하는 데 사용할 수 있습니다 모션트래킹.predictPositions() or MotionTracking.predictPositionsBasedOnAge() 신청서에 따라 적절하다고 판단되는 경우.

신고

The 신고 서비스는 Vantiq 모바일 앱에 알림을 보내는 데 사용됩니다. 이 서비스는 다음 절차를 포함합니다.

  • 알림.deletePayloadMessages(msgIds) – ID가 있는 모든 메시지를 삭제합니다. 메시지 ID 배열입니다. 이는 사용자가 모바일 앱에서 메시지를 삭제할 때 모바일 앱에서 사용됩니다.
  • 알림.retractPayload(msgId, excludeList) – 알림 철회 (ArsPayloadMessage)에 의해 지정됨 메시지 ID Vantiq 모바일 앱으로 전송되었습니다. 제외 목록 알림을 철회하지 않을 사용자 이름 목록을 지정하는 데 사용할 수 있으며, 빈 목록이나 null을 지정하면 모든 사용자에 대한 알림이 철회됩니다.

권하다

The 권하다 서비스에는 내장된 추천 기능이 포함되어 있습니다. 추천 기능은 모두 4개의 매개변수를 사용하는 유사한 패턴을 따릅니다.

  • 매치디렉티브 An Object 추천 시스템의 출력에 영향을 미치는 데 사용할 수 있는 조정 가능한 매개변수를 포함합니다. 모든 추천 시스템은 다음을 준수해야 합니다. 최대 추천추천자가 반환하는 결과 수를 제한하는 기능입니다. 속성 제외이는 일치를 피하고자 하는 속성 목록을 지정합니다.
  • 무늬 입력 Object 일치합니다.
  • 후보 유형 후보 세트를 가져올 유형의 이름입니다.
  • 매치타입 입력 패턴의 유형입니다. 다음과 같은 일부 추천 시스템에서는 근처 추천 matchType은 candidateType과 일치해야 합니다. 기본 권장 사항 일치할 필요는 없습니다.

현재 내장된 추천 기능은 2개입니다.

  • Recommend.defaultRecommendations(matchDirectives, pattern, candidateType, matchType) – 가장 유사한 인스턴스를 찾습니다. 후보 유형 입력에 무늬 패턴과 후보 유형에서 동일한 이름을 가진 모든 속성에 대해 간단한 거리 측정을 사용합니다.
  • 추천.nearbyRecommendations(matchDirectives, pattern, candidateType, matchType) – 패턴에서 제외되지 않은 모든 GeoJSON 필드의 거리를 계산하고 합산하여 패턴과 가장 가까운 candidateType 인스턴스를 찾습니다. matchType은 candidateType과 일치해야 합니다. nearbyRecommendations는 excludeProperties 및 maxRecommendations 외에도 maxDistance matchDirective를 지원하여 패턴에서 maxDistance보다 멀리 떨어진 후보가 결과 목록에 나타나지 않도록 합니다.

자원

The 자원 서비스는 리소스에 대한 특정 정보를 찾는 데 사용됩니다. 이 서비스는 다음과 같은 절차를 포함합니다.

  • 리소스.빌드정보(리소스유형) – 리소스 유형에 대한 빌드 정보를 반환합니다. 이 정보는 해당 리소스 유형이 다른 기능을 사용할 때 사용될 수 있습니다. 관련 빌드 정보가 없으면 반환되는 값은 비어 있습니다.

리소스API

The 리소스API 서비스는 전체에 액세스하는 데 사용됩니다. Vantiq 리소스 API가능하면 대부분의 Vantiq 리소스에 접근하기 위해 보다 직접적인 VAIL 구문을 사용하는 것이 좋습니다. 그러나 아직 VAIL 언어에 직접 바인딩되지 않은(그리고 앞으로도 바인딩되지 않을 가능성이 있는) 리소스 작업이 있습니다. 이 경우 리소스API 서비스를 사용하여 이러한 작업을 실행할 수 있습니다. 이 서비스에는 다음 절차가 포함되어 있습니다.

  • ResourceAPI.executeOp(메시지) – 제공된 작업 메시지에 설명된 리소스 작업을 실행합니다. 다음을 참조하세요. API 참조 가이드 API 사용 방법에 대한 자세한 내용과 해당 섹션을 참조하세요. VAIL 바인딩 요청 메시지와 응답의 구조에 대해.

The 시퀀스 매개변수는 더 이상 사용되지 않으며 후속 릴리스에서 제거될 예정입니다. 다음을 사용하세요. ResourceAPI.executeOpAsSequence(message) 대신 작업이 시퀀스를 생성하는 것으로 알려진 모든 상황에서는 그렇습니다.

  • ResourceAPI.executeOpAsSequence(메시지) – 제공된 작업 메시지에 설명된 리소스 작업을 실행합니다. 응답은 다음과 같이 반환됩니다. 순서이는 잠재적으로 큰 응답을 처리하고 LLM에서 결과를 스트리밍하는 데 유용합니다.
  • ResourceAPI.patch(리소스, 리소스 ID, patchCmds) – 주어진 것을 실행합니다 반점 지정된 리소스 인스턴스에 대한 명령입니다. patchCmds JSON 객체의 배열로 제공됩니다. JSON 패치 형식입니다.

리소스 구성

The 리소스 구성 서비스를 통해 액세스할 수 있습니다 어셈블리 구성 속성 VAIL 규칙 및 절차에 따라.

  • ResourceConfig.get(속성) – 매개변수로 전달된 속성의 구성 값을 반환합니다. 이 속성 이름은 다음에서 정의되어야 합니다. 어셈블리 구성 속성에 대한 사용 섹션 호출 규칙이나 절차를 참조합니다.

의미 검색

The io.vantiq.ai.시맨틱서치 서비스는 지정된 컨텍스트에 저장된 컨텍스트를 사용하여 질문에 답변하는 것을 지원합니다. 의미론적 색인.

  • SemanticSearch.answerQuestion(indexName 문자열 필수, question 필수, qaLLM 문자열, conversationId 문자열, minSimilarity 실수, contextPrompt 문자열, answerProperties 객체, runtimeConfig 객체): 객체 – 지정된 의미 색인에 포함된 컨텍스트를 사용하여 질문에 답합니다. 예상 매개변수는 다음과 같습니다.
    • indexName – 이름 의미 색인 질문에 답할 때 사용합니다.
    • question – 답변해야 할 질문입니다. 이는 String 또는 io.vantiq.ai.ChatMessage 예를 들어, 후자의 형태는 일반적으로 대화에서 질문이 녹음될 때 애플리케이션이 질문에 속성을 첨부하려고 할 때 사용됩니다.
    • qaLLM – 생성적인 LLM 답변을 합성하는 데 사용됩니다. 아니요 qaLLM 값이 제공되면 인덱스의 기본 Q&A LLM이 사용됩니다(있는 경우).
    • conversationId – 질문을 이전에 설정된 "대화"와 연관시킵니다(참조 대화 기억).
    • minSimilarity – 의미 색인에서 반환된 관련 문서를 필터링하는 데 사용되는 0에서 1까지의 숫자입니다. 적합한 문서가 없으면 기본적으로 "모름"으로 답변됩니다. 유사도 임계값이 제공되지 않으면 색인은 점수와 관계없이 가장 관련성이 높은 문서를 반환합니다.
    • contextPrompt – LLM이 진행 중인 대화에서 후속 질문에 답하는 데 가장 관련성 있는 맥락을 식별하는 데 도움이 되는 프롬프트입니다.
    • answerProperties – 첨부될 선택적 속성 ChatMessage 활성 대화에 LLM이 추가될 때 LLM의 응답을 나타내는 인스턴스(대화가 없으면 값은 무시됨).
    • runtimeConfig – LLM 구성 설정을 지정하는 선택적 개체 answerQuestion 호출. 지정된 경우, 런타임 구성 LLM 구성과 병합되어 해당 구성 속성을 재정의합니다. 병합된 구성은 다음에 사용됩니다. answerQuestion 호출; LLM 구성 자체는 변경되지 않습니다.

     

    반환된 객체는 다음과 같은 속성을 갖습니다.

    • 답변 (문자열) – 생성적 LLM이 합성한 답변입니다.
    • 메타 데이터 (객체 배열) – 답변을 합성하는 데 사용된 색인 항목에서 파생된 메타데이터 객체의 배열입니다. 정확한 메타데이터는 색인 항목에 따라 결정됩니다. 의미 색인은 이 속성을 제외하도록 구성할 수 있습니다.
    • 다시 표현된 질문 (문자열) – LLM이 관련 맥락을 사용하여 질문을 다시 표현한 것입니다. 질문을 다시 표현하다 가  false 여기에는 다시 표현된 질문이 포함되지만, LLM에 제출되는 질문은 아닙니다. 이 속성은 의미 색인이 해당 속성을 포함하도록 구성된 경우에만 포함됩니다.
  • SemanticSearch.answerQuestionAsSequence(indexName 문자열 필수, question 필수, qaLLM 문자열, conversationId 문자열, minSimilarity 실수, contextPrompt 문자열, answerProperties 객체, runtimeConfig 객체): 객체 – 지정된 의미 인덱스에 포함된 컨텍스트를 사용하여 질문에 답하고 답변을 반환합니다. 순서. 매개변수 정의는 다음과 같습니다. 답변질문.

이것은 내장된 절차이므로 다음의 일부로 사용할 수 없습니다. 실행 진술. 따라서 결과는 다음을 사용하여 처리해야 합니다. 되풀이 성명서.

  • SemanticSearch.similaritySearch(indexName 문자열 필수, 쿼리 문자열 필수, minSimilarity 실수, metadataFilter 객체, limit 정수): 객체 배열 – 주어진 쿼리를 사용하여 대상 의미 인덱스의 유사성 검색을 수행합니다. 최대 반환값: limit (기본값 4) 인덱스에서 가장 유사한 레코드. 제공 minSimilarity 값(0~1 사이의 숫자)은 최소한 해당 점수를 가진 레코드로 결과를 제한합니다. metadataFilter 값은 일치하는 메타데이터 값을 가진 레코드만 반환하는 데 사용할 수 있습니다. 예상 값을 포함하는 객체(예: {"key1": "val1", "key2": "val2"}, 또는 Qdrant 필터 형식 예 {"must": [{"key": "key1", "match": {"value": "val1"}}, {"key": "key2", "match": {"value": "val2"}}]}반환 값은 목록입니다. Object 다음 속성을 가진 인스턴스:
    • 함유량 (문자열) – 연관된 레코드의 내용입니다.
    • 메타 데이터 (객체 배열) – 레코드의 메타데이터입니다.
    • 점수 (실제) - 레코드의 유사도 점수입니다.
  • SemanticSearch.retrieveChunks(indexName 문자열 필수, entryId 문자열 필수, limit 정수, offset 문자열): 객체 – 항목의 내용을 검색합니다.
    • indexName – 이름 의미 색인 콘텐츠를 검색합니다.
    • entryId – 콘텐츠를 검색할 항목의 ID입니다.
    • limit – 한 번에 검색할 수 있는 청크의 최대 수.
    • offset – 검색을 시작할 청크의 ID입니다. 첫 번째 청크에서 시작합니다. null. 이것은 다음에서 가져와야 합니다. 오프셋 반환된 Object의 필드입니다.

     

    반환된 객체는 다음과 같은 속성을 갖습니다.

    • 오프셋 (문자열) – 향후 사용될 오프셋 청크 검색() 통화가 중단된 부분부터 다시 시작하도록 요청합니다. null if 전철기 이 항목의 마지막 부분을 포함합니다.
    • 전철기 (객체 배열) – 데이터베이스에 저장된 포인트입니다. 다음 형식을 따릅니다.
      • 함유량 (문자열) – 이 청크의 내용입니다.
      • 메타 데이터 (객체) – 이 청크에 대한 메타데이터입니다.

스토리지매니저

The io.vantiq.StorageManager 이 서비스는 플러그형 스토리지 관리자를 사용하여 데이터베이스 트랜잭션을 관리할 수 있는 절차를 제공합니다. 플러그형 스토리지 관리자에 대한 자세한 내용은 다음을 참조하십시오. 스토리지 관리자 가이드 그리고 섹션 거래 지원.

  • StorageManager.startTransaction(storageManager 문자열, 옵션 개체): 문자열 – 지정된 스토리지 관리자에서 트랜잭션을 시작하고 트랜잭션 ID를 반환합니다.
  • StorageManager.commitTransaction(storageManager 문자열, 트랜잭션 문자열, 옵션 객체) – 지정된 저장 관리자에서 지정된 트랜잭션을 커밋합니다.
  • StorageManager.abortTransaction(storageManager 문자열, 트랜잭션 문자열, 옵션 객체) – 지정된 저장 관리자에서 지정된 트랜잭션을 중단합니다.

주형

The io.vantiq.text.템플릿 이 서비스는 템플릿에서 텍스트를 생성하는 절차를 제공합니다.

  • Template.format(템플릿, 입력) – 입력을 템플릿에 적용하여 생성된 텍스트를 반환합니다. 입력 는 Teledyne LeCroy 오실로스코프 및 LSA-XNUMX 시리즈 임베디드 신호 분석기가  Object 키가 변수의 이름인 키/값 쌍 이 템플릿 키 값으로 대체됩니다. 변수는 다음 형식입니다. ${keyName} or $keyName. 리터럴을 포함하려면 $ 템플릿에서 이스케이프 시퀀스를 사용하세요 \$. 처리하는 코드 이 템플릿 값은 모든 이스케이프 시퀀스를 완전히 해석합니다(이것은 VAIL에서 사용될 때 해당 시퀀스의 일반적인 해석에 추가됩니다) String 상수). 예를 들어, 템플릿에 다음을 포함하려면 \ 문자의 경우 템플릿 문자열 값에 다음이 포함되어야 합니다. \\\\ (그리고 단순히 \\).
  • 템플릿.documentReference(문서 이름) – 문서 리소스에 대한 참조를 반환합니다. 문서 이름. 이 참조는 매개변수로 사용될 수 있습니다. 템플릿.포맷().

가장 단순한 형태의 템플릿은 입력의 키 값으로 대체된 변수를 포함하는 문자열일 뿐입니다. 예를 들어,

var input = {name: "alice"}
io.vantiq.text.Template.format("Hello ${name}", input) //  returns "Hello alice"

문자열을 지정하는 대신 템플릿을 문서에 저장할 수 있습니다. 예를 들어, "greetingTemplate"이라는 이름의 문서에 다음 내용이 포함되어 있다고 가정해 보겠습니다.

Hello ${guest}, this is ${host}.

이 템플릿은 다음과 같이 사용할 수 있습니다.

import service io.vantiq.text.Template

var input = {guest: "alice", host: "bob"}
var ref = Template.documentReference("greetingTemplate")
Template.format(ref, input) // returns "Hello alice, this is bob."

템플릿 매개변수는 목록 또는 Object. 이 경우 목록/Object 재귀적으로 구문 분석되고 모든 문서 참조는 텍스트 값으로 변환됩니다. 그런 다음 목록에 포함된 모든 문자열은Object – 키를 제외하고 – 템플릿으로 간주되어 위에서 설명한 대로 처리됩니다. 이 경우 템플릿.포맷() 호출은 템플릿 매개변수와 동일한 구조를 반환하지만 모든 변수는 해당 값으로 대체됩니다.

마지막으로, 입력 값에 문서 참조를 사용할 수도 있습니다. 예를 들어,

# assuming document "prompt.txt" 
As a personal assistant who likes to be ${personality}, you answer the user question in the style of ${author}."

# assuming document "author.txt"
Mark Twain

# assuming document "question.txt"
why did the cow jump over the moon?

우리는 다음과 같이 이 문서를 사용할 수 있습니다.

import service io.vantiq.text.Template

var input = {
    personality: "funny",
    author: Template.documentReference("author.txt"),
    question: Template.documentReference("question.txt")
}

var template = {
    prompt: Template.documentReference("prompt.txt"),
    ask: "The question is: ${question}"    
}

var templateResult = Template.format(template, input)

그리고 templateResult 값은 다음과 같습니다.

{
    prompt: "As a personal assistant who likes to be funny, you answer the user question in the style of Mark Twain.",
    ask: "The question is: why did the cow jump over the moon?"
} 

텐서플로우 오퍼레이션

TensorFlow, TensorFlow 로고 및 관련 상표는 Google Inc.의 상표입니다.

The 텐서플로우 오퍼레이션 서비스는 문서 또는 이미지에 대해 지정된 신경망 모델을 실행하는 기능을 제공합니다. 이 기능에 대한 자세한 내용은 다음을 참조하세요. 이미지 처리 가이드. 여기에는 다음 절차가 포함되어 있습니다.

YOLO 모델

다음 절차를 사용하여 YOLO 모델(유형 모델)을 실행하십시오. tensorflow/yolo)

  • TensorFlowOperation.processDocument(문서, 모델 이름, 신뢰도, 색상 스케일 계수)
  • TensorFlowOperation.processImage(이미지, 모델 이름, 신뢰도, 색상 스케일 계수)
  • TensorFlowOperations.processTempImage(tempImage, 모델 이름, 신뢰도, colorScaleFactor)
    • 문서영상및 임시 이미지 – 처리할 문서 또는 이미지
      • 사용시 TensorFlowOperations.processTempImage() 밸리 tempImage 매개변수는 비디오 소스 또는 이벤트 콘텐츠에 대한 SELECT 명령문에서 반환된 엔터티여야 합니다.
    • 모델명 – 사용할 TensorFlow 모델의 이름
    • 자신 - Real 문서나 이미지에서 무언가를 식별하는 데 필요한 신뢰도를 지정하는 0~1 사이의 숫자입니다. 0.75는 75% 신뢰도를 의미합니다.
    • 색상 스케일 계수 – 선택 사항이며 거의 사용되지 않습니다. 이것은 Integer 이미지의 색상 값을 부동 소수점 숫자로 변환하는 데 사용되는 0에서 255 사이의 값입니다. 기본값은 일반적으로 255이며, 이 값이 가장 적합합니다.
    • 결과 – 각 객체가 모델에서 감지한 객체를 설명하는 객체 목록입니다. 이는 자세히 설명되어 있습니다. 여기에서 확인하세요.

일반 Tensorflow 모델

다음을 사용하여 다른 모델(유형 모델)을 실행하십시오. tensorflow/plain)

  • TensorFlowOperation.executeTFModelOnDocument(문서, 모델 이름, 입력)
  • TensorFlowOperation.executeTFModelOnImage(이미지, 모델 이름, 입력)
  • TensorFlowOperation.executeTFModelOnTempImage(tempImage, 모델 이름, 입력)
    • 문서영상및 임시 이미지 – 처리할 문서 또는 이미지
      • 사용시 TensorFlowOperations.executeTFModelOnTempImage() 밸리 tempImage 매개변수는 비디오 소스 또는 이벤트 콘텐츠에 대한 SELECT 명령문에서 반환된 엔터티여야 합니다.
    • 모델명 – 사용할 tensorflow 모델의 이름
    • 입력 – Object 실행을 위한 입력 사양을 포함합니다
  • TensorFlowOperation.executeTFModelOnTensors(모델 이름, 입력)
    • 모델명 – 사용할 tensorflow 모델의 이름
    • 입력 – Object 실행을 위한 입력 사양을 포함합니다

결과는 Object 이름으로 식별되는 출력 텐서로 구성됩니다.

The 입력 매개변수는 다음과 같아야 합니다. Object 다음 속성을 포함합니다:

  • 대상텐서이름 – 이것은 이미지나 문서를 넣을 텐서의 이름입니다.
    • 이 값은 전달되어서는 안 됩니다. TensorFlowOperation.executeTFModelOnTensors().
  • 입력텐서 – (선택 사항) 모델에 다른 입력이 필요한 경우 여기에 다음이 포함됩니다. Object 각 입력 텐서는 해당 텐서에 대해 명명된 속성을 통해 제공되며 속성 값은 다음과 같습니다. Object 두 가지 속성을 포함합니다:
    • 텐서타입 - String 텐서의 유형을 식별합니다.
    • 가치 – 제공될 값.

이러한 유형의 TensorFlow 모델을 다루는 것은 복잡합니다. 자세한 내용은 여기에서 확인하세요. 여기에서 확인하세요일부 설치 환경에서는 일반 Tensorflow 모델 사용에 제한이 있을 수 있습니다. 자세한 내용은 다음을 참조하세요. 운영 제한 를 참조하세요

간단한 예로, 우리가 다음과 같은 이미지를 처리하고 싶다고 가정해 보겠습니다. 마이카.jpg 라는 모델을 사용하여 자동차 식별. 더 나아가 가정하다 자동차 식별 3개(XNUMX)의 입력 텐서를 지원합니다.

  • 'carPic' - 분석할 이미지
  • '년도' - (선택 사항) 자동차가 제조된 연도
  • '국가' - (선택 사항) 자동차의 원산지.

그 자동차 식별 두 개(2)의 텐서를 반환합니다.

  • modelName – 문자열, 자동차 모델
  • manufacturer – 자동차 제조업체인 String

그러면 다음과 같이 간단한 버전(선택적 매개변수 제외)을 실행할 수 있습니다.

var tfResult = TensorFlowOperations.executeTFModelOnImage(
                "mycar.jpg",
                "identifyCars",
                { targetTensorName: "carPic" })

모든 입력 매개변수를 포함하는 보다 복잡한 버전은 다음과 같습니다.

var tfResult = TensorFlowOperations.executeTFModelOnImage(
                "mycar.jpg",
                "identifyCars",
                { targetTensorName: "carPic",
                  inputTensors: {
                        year: { tensorType: "int", value: 1980 },
                        country: { tensorType: "string", value: "USA"}
                    }
                 })

이 코드 조각을 실행한 후, tfResults (해당 이미지에 따라) 값이 다음과 같은 객체가 됩니다.

{
    modelName: { tensorType: "string", value: "Fusion" },
    manufactuer: { tensorType: "string", value: "Ford" }
}

이전 예제에서 입력 및 출력 텐서(입력 이미지 제외)는 스칼라입니다. 즉, 단순한 숫자 또는 문자열입니다. 물론 입력 또는 출력 텐서는 배열일 수 있습니다. TensorFlow 텐서는 항상 단일 단순 타입(위에 나열됨)이며, 일반 타입입니다. 즉, 배열의 모든 행은 동일한 개수의 열을 가지며, 물론 차원 수에 제한 없이 확장 가능합니다.

이것이 어떻게 표현되는지 보기 위해 이 예를 조금 확장해 보겠습니다. 자동차 식별 또한 (텐서라는 이름으로) 반환합니다. 색상) 자동차가 원래 제공되었던 색상 목록입니다. 위의 호출 예시를 다시 사용하면, tfResults (해당 이미지에 따라) 값이 다음과 같은 객체가 됩니다.

{
    modelName: { tensorType: "string", value: "Fusion" },
    manufactuer: { tensorType: "string", value: "Ford" },
    colors: { tensorType: "string", value: [ "red", "midnight pearl", "chartreuse", "taupe" ] }
}

Test

The Test  이 서비스를 통해 개발자는 소스 "모의"와 같은 애플리케이션 테스트 환경의 여러 측면을 제어할 수 있습니다. 이 기능에 대한 자세한 내용은 테스트 가이드. 여기에는 다음 절차가 포함되어 있습니다.

  • Test.sendMockSourceEvent(소스 이름 필수, 메시지 필수, 주제) – 지정된 소스에서 수신된 것처럼 보이는 이벤트를 생성합니다. 이벤트 데이터는 다음과 같습니다. message 값. 선택 사항 topic 주제(예: MQTT 또는 Kafka)로부터 데이터를 수신하는 소스에 대해 지정할 수 있습니다.
  • Test.startSourceMocking(sourceName, mockQueryProcedure, mockPublishProcedure) – 조롱을 켜십시오   에 의해 식별 소스 이름. 선택 사항 모의쿼리절차   모의게시절차 각 작업에 대한 기본 모의 동작을 재정의하는 기능을 제공합니다. 지정되지 않은 경우(또는 null), 기본 모의 동작은 변경되지 않습니다.
  • 테스트.stopSourceMocking(소스 이름) – 조롱을 끕니다.   에 의해 식별 소스 이름.

활용

The 활용 이 서비스에는 다음을 포함한 유용한 절차가 포함되어 있습니다.

  • 유틸리티.getHttpHeaders() – REST 호출을 통해 호출된 프로시저의 경우 Authorization 헤더를 제외한 요청의 HTTP 헤더를 반환합니다.
  • Utils.initPushSource(푸시소스이름) – 이름이 있는 푸시 소스를 검증합니다. pushSourceName 존재하지 않으면 지정된 이름으로 푸시 소스를 생성합니다. 이름을 지정하지 않으면 "VantiqPushNotification"이라는 이름이 사용됩니다.
  • Utils.stripSystemProperties(객체) – 사용자가 객체에서 직접 수정해서는 안 되는 모든 시스템 속성을 제거하고 수정된 객체를 반환합니다. 예제 속성은 다음과 같습니다. ars_createdAt   _신분증. 영구 데이터 모델에서 리소스 인스턴스를 선택하고 수정한 다음 해당 인스턴스를 사용할 때 유용합니다. UPDATE 성명서, 그래서 UPDATE 읽기 전용 시스템 속성을 업데이트하려고 하지 않습니다.
  • Utils.deepMerge(대상, 소스) – 소스 객체를 대상 객체에 재귀적으로 병합합니다. 대상 객체에 객체 속성이 있는 경우, 소스 객체의 속성이 대상 객체의 속성에 병합됩니다. 대상 객체에 배열 속성이 있는 경우, 소스 객체의 속성은 배열 인덱스를 기준으로 대상 객체의 속성에 병합됩니다. 대상 객체에 스칼라 속성이 있는 경우, 소스 객체의 속성이 대상 객체의 속성을 대체합니다. 대상 객체는 그 자리에서 수정되어 반환되지만, 소스 객체는 수정되지 않습니다. 다음은 그 예입니다.
    var target = {
        'a': [{ 'b': 2 }, { 'd': 4 }]
    }

    var source = {
        'a': [{ 'c': 3 }, { 'e': 5 }]
    }

    Utils.deepMerge(target, source)
    // target becomes => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }

    target = {
        'a': 1
    }

    source = {
        'a': { 'b': 2 }
    }

    Utils.deepMerge(target, source)
    // target becomes => { 'a': { 'b': 2 }}

특정 키의 소스 값이 객체 또는 배열이 아닌 경우, 소스 값이 대상 값을 대체합니다. 예:

    var target = {
        'a': { 'b': 1 }
    }

    var source = {
        'a': 2
    }

    Utils.deepMerge(target, source)
    // target becomes => { 'a': 2 }
저작권 © 2024 VANTIQ, Inc.
이 글이 도움 되었나요?
0 5의 점 받음
5 별 0%
4 별 0%
3 별 0%
2 별 0%
1 별 0%
5
피드백을 공유해주세요
이 기사를 어떻게 개선할 수 있나요?
이전 보기 리소스 참조 가이드
다음 어셈블리 참조 가이드