T.cursor(x:C,…;wi,...;mcs)

Read(845) Label: multicursor, segment, attached table,

Description:

Synchronously segment an entity table/in-memory table/multizone composite table according to a multicursor and return a multicursor.

Syntax:

T.cursor(x:C,…;wi,...;mcs)

Note:

The function synchronously segments entity table/in-memory table/multizone composite table T according to multicursor mcs, during which T’s first field and mcs’s first field will be matched, and returns a multicursor. When T is a multizone composite table, merge zone tables by their dimensions.

Parameter:

T

An entity table/in-memory table/multizone composite table; should not be composite table stored in row-wise.

x

An expression.

C

The column alias.

wi

Filtering condition; retrieve the whole set when this parameter is absent; separate multiple conditions by comma(s) and their relationships are AND. Besides regular filtering expressions, you can also use the following five types of syntax in a filtering condition, where K is a field in the entity table:

1K=w

w usually uses expression Ti.find(K) or Ti.pfind(K), where Ti is a table sequence. When value of w is null or false, the corresponding record in the entity table will be filtered away; when w is expression Ti.find(K) and the to-be-selected fields C,... contain K, Tis referencing field will be assigned to K; when w is expression Ti.pfind(K) and the to-be-selected fields C,... contain K, sequence numbers of K values in Ti will be assigned to K.

2(K1=w1,Ki=wi,w)

Ki=wi is an assignment expression. Generally, parameter wi can use expression Ti.find(Ki) or Ti.pfind(K), where Ti is a table sequence; when wi is expression Ti.find(Ki) and the to-be-selected fields C,... contain Ki, Ti’s referencing field will be assigned to Ki correspondingly; when wi is expression Ti.pfind(Ki) and the to-be-selected fields C,... contain Ki, sequence numbers of Ki values in Ti will be assigned to Ki.

w is a filter expression; you can reference Ki in w.

3K:Ti

Ti is a table sequence. Compare Ki value in the entity table with key values of Ti and discard records whose Ki value does not match; when the to-be-selected fields C,... contain K, Ti’s referencing field will be assigned to K.

4K:Ti:null

Filter away all records that satisfy K: Ti.

5K:Ti:#

Locate records according to sequence numbers, compare sequence numbers of records in table sequence Ti according to the entity table’s K values, and discard non-matching records; when the to-be-selected fields C,... contain K, Ti’s referencing field will be assigned to K.

 

mcs

A multicursor generated from an entity table

Option:

@k

Perform matching using the multicursor’s first field of the key

@v

Generate a pure table sequence-based column-wise cursor, which has higher performance than regular cursors

@x

Automatically close the entity table after data is fetched from the cursor

@g

 When T is a multizone composite table and if group() operation will be executed on the result cursor, use this option to speed up the computation.

@w

Used on a multizone composite table with the update mark;

Perform update merge; when zone tables share a same key value, ignore the record contained in the zone table with a smaller number; segmentation is performed according to the way zone table 1 is split;

Handle the update mark and do not return records with a deletion mark to the cursor; but if the key value of a record with the deletion mark is unique in the multizone composite table, just retain it;

This option enables retrieving key field(s) as well as the deletion mark field, if there is one, forcefully

@p

Perform MERGE by the first field when parameter T is a multizone composite table.

Return value:

Multicursor

Example:

 

A

 

1

for 100

 

2

=to(10000).new(#:k1,rand():c1).sort@o(k1)

Return a table sequence:

3

=to(10000).new(#:k1,rand(10000):c2).sort@o(k1)

Return a table sequence:

4

=to(10000).new(#:k1,rand()*1000:c3).sort@o(k1)

Return a table sequence:

5

=A2.cursor()

Return a cursor.

6

=A3.cursor()

Return a cursor.

7

=A4.cursor()

Return a cursor.

8

=file("D:\\cs1.ctx")

Generate a composite table file.

9

=A8.create(#k1,c1)

Create the composite table’s base table.

10

=A9.append(A5)

Append data in A5’s cursor to the base table.

11

=A9.attach(table1,c2)

Create attached table table1 on base table.

12

=A11.append(A6)

Append data in A6’s cursor to table1.

13

=A11.cursor@m(;;2)

Segment the attached table and return a multicursor.

14

=A9.attach(table2,c3)

Create attached table table2 on base table.

15

=A14.append(A7)

Append data in A7’s cursor to table2.

16

=A14.cursor@v(;;A13)

Segment table2 according to A13’s multicursor.

 

When T is a multizone composite table:

 

A

 

1

=connect("demo").cursor("select  EID,NAME from  employee")

 

2

=file("emp.ctx")

Generate a composite table file.

3

=A2.create@y(#EID,NAME)

Create the composite table’s base table.

4

=A3.append(A1)

Append data in A1’s cursor to the composite table’s base table.

5

=A4.cursor@m(;;3)

Generate a multicursor having 3 subcursors according to the composite table.

6

=connect("demo").cursor("select  EID,NAME,GENDER,SALARY  from  employee")

 

7

=file("emp.ctx":[1,2])

Generate a homo-name files group.

8

=A7.create@y(#EID,NAME,GENDER,SALARY;if(GENDER=="F",1,2))

Create a multizone composite table.

9

=A8.append@x(A6)

Append data in A6’s cursor to the multizone composite table and its content is as follows:

10

=A8.cursor(EID,NAME,GENDER,SALARY;SALARY>5000;A5)

Split A8’s multizone composite table synchronously according to A5’s multicursor, perform merge by default and return a cursor as follows:

We can see that data in two zone tables are merged by their dimensions.

 

Use special types of filtering conditions:

 

A

 

1

=file("emp.ctx")

 

2

=A1.open()

Open the composite table file.

3

=A2.import()

As no parameters are present, return all data in the entity table.

4

=file("emp1.ctx").open().cursor@m(;;2)

Return a multicursor.

5

=5.new(~:ID,~*~:Num).keys(ID)

Generate a table sequence using ID as the key.

6

=A2.cursor(EID,NAME;EID=A5.find(EID);A4)

Use K=w filtering mode; in this case w is Ti.find(K) and entity table records making EID=A4.find(EID) get null or false are discarded; EID is the selected field, to which table sequence A5’s referencing field is assigned.

7

=A2.cursor(EID,NAME;EID=A5.pfind(EID);A4)

Use K=w filtering mode; in this case w is Ti.pfind(K) and entity table records making EID=A4.pfind(EID) get null or false are discarded; EID is the selected field, to which its sequence numbers in table sequence A5 are assigned.

8

=A2.cursor(EID,NAME;EID:A5;A4)

Use K:Ti filtering mode; compare the entity table’s EID values with the table sequence’s key values and discard entity table records that cannot match.

9

=A2.cursor(NAME,SALARY;EID:A5;A4)

This is a case where K isn’t selected; EID isn’t the selected field, so only filtering is performed.

10

=A2.cursor(EID,NAME;EID:A5:null;A4)

Use K:Ti:null filtering mode; compare the entity table’s EID values with the table sequence’s key values and discard entity table records that can match.

11

=A2.cursor(EID,NAME;EID:A5:#;A4)

Use K:Ti:# filtering mode; compare with sequence numbers of table sequence’s records according to the entity table’s EID values, and discard records that cannot match.

12

=connect("demo").query("select top 2  NAME,GENDER  from employee").keys(NAME)

Return a table sequence using NAME as the key.

13

=A2.cursor(EID,NAME;(EID=A5.find(EID),NAME=A12.find(NAME),EID!=null

&&NAME!=null);A4)

Use (K1=w1,Ki=wi,w) filtering mode; return records that meet all conditions.

Use @w option to recognize update mark:

 

A

 

1

=connect("demo").cursor("select  EID,NAME from  employee")

 

2

=file("e-mcs.ctx")

Generate a composite table file.

3

=A2.create@y(#EID,NAME)

Create the composite table’s base table.

4

=A3.append(A1)

Append cursor A1’s data to the composite table’s base table.

5

=A4.cursor@m(;;3)

Create a 3-subcursor multicursor based on the composite table.

6

=connect("demo").cursor("select  EID,NAME,GENDER  from employee") 

 

7

=A6.derive(:Defiled)

 

8

=A7.new(EID,Defiled,NAME,GENDER)

Return a cursor whose content is as follows:

9

=file("ecd.ctx":[1,2])

Define a homo-name files group: 1.ec.ctx and 2.ec.ctx.

10

=A9.create@yd(#EID,Defiled,NAME,GENDER;if(GENDER=="F",1,2))

Create a multizone composite table, set EID as its key, use @d option to make Defiled as the update mark field, and put records where GENDER is F to 1.ed.ctx and the other records to 2.ed.ctx.

11

=A10.append@ix(A8)

Append cursor A8’s data to A10’s multizone composite table.

12

=create(EID,Defiled,NAME,GENDER).record([0,true,,,1,true,,,

2,false,"BBB","F"])

Return a table sequence whose content is as follows:

13

=file("ecd.ctx":[3])

 

14

=A13.create@yd(#EID,Defiled,NAME,GENDER;3)

Add a new zone table 3.ecd.ctx, where Defiled is the update mark field.

15

=A14.append@i(A12)

Append table sequence A12’s records to zone table 3.ecd.ctx.

16

=file("ecd.ctx":[1,2,3]).open()

 

17

=A16.cursor(;;A5)

Split A16’s multizone composite table synchronously according to multicursor A5, and return a multicursor.

18

=A17.fetch()

Fetch data from cursor A17.

19

=A16.cursor@w(;;A5)

Use @w option to split multizone composite table ecd.ctx into multiple segments according to multicursor A5, return the segmented composite table as a multicursor, recognize the update mark – that is:

won’t return the record whose EID value is 1 and whose update mark is true (meaning to-be-deleted) to the result multicursor;

Modify the record whose EID value is 2 and whose update mark is false (meaning to-be-modified);

Retain the record whose primary key value is unique though it is marked by a deletion mark – that is, return the record whose EID value is 0 to the result multicursor.

20

=A19.fetch()

Fetch data from cursor A19.