Ngôn ngữ Q - Thuộc tính

Danh sách, từ điển hoặc cột của bảng có thể có các thuộc tính được áp dụng cho chúng. Các thuộc tính áp đặt các thuộc tính nhất định trên danh sách. Một số thuộc tính có thể biến mất khi sửa đổi.

Các loại thuộc tính

Đã sắp xếp (`s #)

`s # có nghĩa là danh sách được sắp xếp theo thứ tự tăng dần. Nếu danh sách được sắp xếp rõ ràng theo asc (hoặc xasc), danh sách sẽ tự động có bộ thuộc tính đã sắp xếp.

q)L1: asc 40 30 20 50 9 4

q)L1
`s#4 9 20 30 40 50

Một danh sách được biết là đã được sắp xếp cũng có thể có thuộc tính được đặt rõ ràng. Q sẽ kiểm tra xem danh sách có được sắp xếp hay không và nếu không, s-fail lỗi sẽ được ném ra.

q)L2:30 40 24 30 2

q)`s#L2
's-fail

Thuộc tính được sắp xếp sẽ bị mất khi có một phần phụ không được sắp xếp.

Đã chia tay (`p #)

`p # có nghĩa là danh sách được chia nhỏ và các mục giống hệt nhau được lưu trữ liền kề.

Phạm vi là một int hoặc là temporal type có giá trị int cơ bản, chẳng hạn như năm, tháng, ngày, v.v. Bạn cũng có thể phân vùng trên một ký hiệu miễn là nó được liệt kê.

Việc áp dụng thuộc tính parted sẽ tạo ra một từ điển chỉ mục ánh xạ từng giá trị đầu ra duy nhất tới vị trí xuất hiện đầu tiên của nó. Khi một danh sách được tách ra, việc tra cứu sẽ nhanh hơn nhiều, vì tìm kiếm tuyến tính được thay thế bằng tra cứu bảng băm.

q)L:`p# 99 88 77 1 2 3

q)L
`p#99 88 77 1 2 3

q)L,:3

q)L
99 88 77 1 2 3 3

Note −

  • Thuộc tính parted không được giữ nguyên trong một thao tác trên danh sách, ngay cả khi thao tác đó giữ nguyên phân vùng.

  • Thuộc tính parted nên được xem xét khi số lượng thực thể lên đến một tỷ và hầu hết các phân vùng có kích thước đáng kể, tức là có sự lặp lại đáng kể.

Đã nhóm (`g #)

`g # có nghĩa là danh sách được nhóm lại. Một từ điển nội bộ được xây dựng và duy trì để ánh xạ từng mục duy nhất tới từng chỉ mục của nó, đòi hỏi không gian lưu trữ đáng kể. Để biết danh sách độ dàiL chứa đựng u các mặt hàng độc đáo có kích thước s, cái này sẽ (L × 4) + (u × s) byte.

Việc nhóm có thể được áp dụng cho một danh sách khi không có giả định nào khác về cấu trúc của nó.

Thuộc tính có thể được áp dụng cho bất kỳ danh sách đã nhập nào. Nó được duy trì khi bổ sung, nhưng bị mất khi xóa.

q)L: `g# 1 2 3 4 5 4 2 3 1 4 5 6

q)L
`g#1 2 3 4 5 4 2 3 1 4 5 6

q)L,:9

q)L
`g#1 2 3 4 5 4 2 3 1 4 5 6 9

q)L _:2

q)L
1 2 4 5 4 2 3 1 4 5 6 9

Duy nhất (`#u)

Việc áp dụng thuộc tính duy nhất (`u #) cho một danh sách chỉ ra rằng các mục của danh sách là khác biệt. Biết rằng các phần tử của danh sách là duy nhất giúp tăng tốc đáng kểdistinct và cho phép q để thực hiện một số so sánh sớm.

Khi một danh sách được gắn cờ là duy nhất, một bản đồ băm nội bộ sẽ được tạo cho từng mục trong danh sách. Các thao tác trong danh sách phải bảo toàn tính duy nhất nếu không thuộc tính sẽ bị mất.

q)LU:`u#`MSFT`SAMSUNG`APPLE

q)LU
`u#`MSFT`SAMSUNG`APPLE

q)LU,:`IBM                        /Uniqueness preserved

q)LU
`u#`MSFT`SAMSUNG`APPLE`IBM

q)LU,:`SAMSUNG                    / Attribute lost

q)LU
`MSFT`SAMSUNG`APPLE`IBM`SAMSUNG

Note −

  • `u # được bảo toàn trên các đoạn nối để bảo toàn tính duy nhất. Nó bị mất khi xóa và nối không duy nhất.

  • Tìm kiếm trên danh sách `u # được thực hiện thông qua một hàm băm.

Xóa các thuộc tính

Các thuộc tính có thể bị xóa bằng cách áp dụng `#.

Áp dụng các thuộc tính

Ba định dạng để áp dụng các thuộc tính là:

  • L: `s# 14 2 3 3 9/ Chỉ định trong khi tạo danh sách

  • @[ `.; `L ; `s#]/ Áp dụng chức năng, tức là cho danh sách biến L

    / trong không gian tên mặc định (tức là `.) áp dụng

    / thuộc tính `s # đã được sắp xếp

  • Update `s#time from `tab

    / Cập nhật bảng (tab) để áp dụng

    / thuộc tính.

Hãy áp dụng ba định dạng khác nhau ở trên với các ví dụ.

q)/ set the attribute during creation

q)L:`s# 3 4 9 10 23 84 90

q)/apply the attribute to existing list data

q)L1: 9 18 27 36 42 54

q)@[`.;`L1;`s#]
`.

q)L1                 / check
`s#9 18 27 36 42 54

q)@[`.;`L1;`#]       / clear attribute
`.

q)L1
9 18 27 36 42 54

q)/update a table to apply the attribute

q)t: ([] sym:`ibm`msft`samsung; mcap:9000 18000 27000)

q)t:([]time:09:00 09:30 10:00t;sym:`ibm`msft`samsung; mcap:9000 18000 27000)

q)t

    time         sym    mcap
---------------------------------
  09:00:00.000   ibm    9000
  09:30:00.000   msft   18000
  10:00:00.000  samsung 27000

q)update `s#time from `t
`t

q)meta t               / check it was applied

    c  | t f a
------ | -----
  time | t s
  sym  | s
  mcap | j
  
Above we can see that the attribute column in meta table results shows the time column is sorted (`s#).