2014-04-17 1 views
1

내가 단순한 CQL 테이블이 상상CQL 바이너리 프로토콜 및 명명 된 바인딩 변수

CREATE TABLE test (
k int PRIMARY KEY, 
v1 text, 
v2 int, 
v3 float 
) 

이 하나가 카산드라의 스키마없는 본질의 사용을 해보고 싶어요 많은 경우가 있고 일부 설정 값 및 수행 예를 들어,이

INSERT into test (k, v1) VALUES (1, 'something'); 

카산드라 클러스터에 같은 CQL 테이블에 쓸 수있는 응용 프로그램을 작성, 필요가 준비된 문을 사용하여이 즉시 성능상의 이유로 발생 할 수 있습니다.

이것은 다른 드라이버에 의해 다른 방식으로 처리됩니다. 예를 들어 Java 드라이버는 (CQL 바이너리 프로토콜의 수정을 통해) 명명 된 바운드 변수를 사용할 수있는 기회를 도입했습니다. 매우 실용적인 : CASSANDRA-6033

제가 궁금한 것은 바이너리 프로토콜 관점에서 준비된 쿼리에서 바운드 변수의 하위 집합에 대해서만 값을 제공하는 올바른 방법은 무엇입니까? 사실

값은 다음과 내가 얻을이 설명에서 [바이트]

[bytes]  A [int] n, followed by n bytes if n >= 0. If n < 0, 
       no byte should follow and the value represented is `null`. 

의 정의를 참고

4.1.4. QUERY 
[...] 
Values. In that case, a [short] <n> followed by <n> [bytes] 
values are provided. Those value are used for bound variables in 
the query. 

에 설명 된대로 값 목록을 구축하여 준비된 쿼리에 제공 :

  1. QUERY의 "값"은 특정 값으로 을 제공 할 방법이 없습니다. 열. 이것은 값의 순서가 정해진 목록 일뿐입니다. 나는 [short]가 준비된 쿼리에서 바운드 변수의 정확한 수와 일치해야한다고 생각하십니까?
  2. 모든 값은 유형에 관계없이 [바이트]로 표시됩니다. 이것이 사실이라면 [bytes] 값의 해석은 서버에 남겨집니다 (int, short, text, ...로 변환)?

나는이 값이 적당하다고 가정하고, 바인딩 된 변수를 '건너 뛰고'값을 할당하지 않고 'null'[바이트] 값을 사용할 수 있는지 궁금합니다.

나는 이것을 시험해보고 cpp 드라이버를 패치했다 (이것이 내가 관심있는 것이다). 쿼리가 실행되지만 clqsh에서 SELECT를 수행하면 빈 필드에 대한 'null'문자열 표현이 표시되지 않습니다. 그래서 해킹이되는 이유가 몇 가지 이유가 있습니다. .

죄송하지만 실제로 자바 드라이버를 다운로드하고 이름이 바운드 변수가 구현되는 방법을 볼 수는 없다고 생각합니다. :(

---------- 편집 -이 해결 ----------

내 가정이 옳았 지금 준비된 쿼리에왔다 필드를 건너 뛸 지원 널에게 [바이트 값]을 사용하여 CPP 드라이버 (here 참조)에 추가됩니다.

답변

0

앞서 설명한 원리를 기반으로 달성하려는 내용이 구현되었습니다 (here 참조).

1

내가 궁금하는 올바른 방법은,보기의 바이너리 프로토콜 지점에서, 만의 하위 집합에 대한 값을 제공하는 것입니다 준비된 쿼리에서 바운드 변수?

에만 삽입하는 쿼리를 준비 할 필요가/당신이에 관심이 컬럼의 일부를 업데이트합니다.

"값"QUERY 특정 컬럼에 대한 값을 제공 할 방법을 제공하지 않습니다에 . 이것은 값의 순서가 정해진 목록 일뿐입니다. 나는 [short]가 준비된 쿼리에서 바운드 변수의 정확한 수와 일치해야한다고 생각하십니까?

맞습니다. 순서는 Cassandra가 쿼리를 준비 할 때 반환하는 열 메타 데이터에 의해 결정됩니다.

모든 값은 유형에 관계없이 [바이트]로 표시됩니다. 이것이 사실이라면 [bytes] 값의 해석은 서버에 남겨집니다 (int, short, text, ...로 변환)?

그게 맞습니다. 드라이버는 반환 된 열 메타 데이터를 사용하여 네이티브 값 (문자열, UUIDS, ints 등)을 이진 (바이트) 형식으로 변환하는 방법을 결정합니다. Cassandra는이 조작의 역함수를 서버 측에서 수행합니다.

나는이 값이 적당하다고 가정하고, 'null'[bytes] 값을 사용하여 바운드 변수를 '건너 뛰고'값을 할당하지 않을지 궁금합니다.

null 열 삽입은 삭제로 해석됩니다.