@ -5,44 +5,45 @@ import { ArrayVector } from '../../vector';
import { transformDataFrame } from '../transformDataFrame' ;
import { transformDataFrame } from '../transformDataFrame' ;
import { DataTransformerID } from './ids' ;
import { DataTransformerID } from './ids' ;
import { SeriesToColumnsOptions , seriesToColumnsTransformer } from './seriesToColumns' ;
import { JoinMode , SeriesToColumnsOptions , seriesToColumnsTransformer } from './seriesToColumns' ;
describe ( 'SeriesToColumns Transformer' , ( ) = > {
describe ( 'SeriesToColumns Transformer' , ( ) = > {
beforeAll ( ( ) = > {
beforeAll ( ( ) = > {
mockTransformationsRegistry ( [ seriesToColumnsTransformer ] ) ;
mockTransformationsRegistry ( [ seriesToColumnsTransformer ] ) ;
} ) ;
} ) ;
const everySecondSeries = toDataFrame ( {
describe ( 'outer join' , ( ) = > {
name : 'even' ,
const everySecondSeries = toDataFrame ( {
fields : [
name : 'even' ,
{ name : 'time' , type : FieldType . time , values : [ 3000 , 4000 , 5000 , 6000 ] } ,
fields : [
{ name : 'temperature' , type : FieldType . number , values : [ 10.3 , 10.4 , 10.5 , 10.6 ] } ,
{ name : 'time' , type : FieldType . time , values : [ 3000 , 4000 , 5000 , 6000 ] } ,
{ name : 'humidity' , type : FieldType . number , values : [ 10000.3 , 10000.4 , 10000.5 , 10000.6 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 10.3 , 10.4 , 10.5 , 10.6 ] } ,
] ,
{ name : 'humidity' , type : FieldType . number , values : [ 10000.3 , 10000.4 , 10000.5 , 10000.6 ] } ,
} ) ;
] ,
} ) ;
const everyOtherSecondSeries = toDataFrame ( {
const everyOtherSecondSeries = toDataFrame ( {
name : 'odd' ,
name : 'odd' ,
fields : [
fields : [
{ name : 'time' , type : FieldType . time , values : [ 1000 , 3000 , 5000 , 7000 ] } ,
{ name : 'time' , type : FieldType . time , values : [ 1000 , 3000 , 5000 , 7000 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 11.1 , 11.3 , 11.5 , 11.7 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 11.1 , 11.3 , 11.5 , 11.7 ] } ,
{ name : 'humidity' , type : FieldType . number , values : [ 11000.1 , 11000.3 , 11000.5 , 11000.7 ] } ,
{ name : 'humidity' , type : FieldType . number , values : [ 11000.1 , 11000.3 , 11000.5 , 11000.7 ] } ,
] ,
] ,
} ) ;
} ) ;
it ( 'joins by time field' , async ( ) = > {
it ( 'joins by time field' , async ( ) = > {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
id : DataTransformerID.seriesToColumns ,
id : DataTransformerID.seriesToColumns ,
options : {
options : {
byField : 'time' ,
byField : 'time' ,
} ,
} ,
} ;
} ;
await expect ( transformDataFrame ( [ cfg ] , [ everySecondSeries , everyOtherSecondSeries ] ) ) . toEmitValuesWith (
await expect ( transformDataFrame ( [ cfg ] , [ everySecondSeries , everyOtherSecondSeries ] ) ) . toEmitValuesWith (
( received ) = > {
( received ) = > {
const data = received [ 0 ] ;
const data = received [ 0 ] ;
const filtered = data [ 0 ] ;
const filtered = data [ 0 ] ;
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
Array [
Array [
Object {
Object {
"config" : Object { } ,
"config" : Object { } ,
@ -128,23 +129,23 @@ describe('SeriesToColumns Transformer', () => {
} ,
} ,
]
]
` );
` );
}
}
) ;
) ;
} ) ;
} ) ;
it ( 'joins by temperature field' , async ( ) = > {
it ( 'joins by temperature field' , async ( ) = > {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
id : DataTransformerID.seriesToColumns ,
id : DataTransformerID.seriesToColumns ,
options : {
options : {
byField : 'temperature' ,
byField : 'temperature' ,
} ,
} ,
} ;
} ;
await expect ( transformDataFrame ( [ cfg ] , [ everySecondSeries , everyOtherSecondSeries ] ) ) . toEmitValuesWith (
await expect ( transformDataFrame ( [ cfg ] , [ everySecondSeries , everyOtherSecondSeries ] ) ) . toEmitValuesWith (
( received ) = > {
( received ) = > {
const data = received [ 0 ] ;
const data = received [ 0 ] ;
const filtered = data [ 0 ] ;
const filtered = data [ 0 ] ;
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
Array [
Array [
Object {
Object {
"config" : Object { } ,
"config" : Object { } ,
@ -244,27 +245,27 @@ describe('SeriesToColumns Transformer', () => {
} ,
} ,
]
]
` );
` );
}
}
) ;
) ;
} ) ;
} ) ;
it ( 'joins by time field in reverse order' , async ( ) = > {
it ( 'joins by time field in reverse order' , async ( ) = > {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
id : DataTransformerID.seriesToColumns ,
id : DataTransformerID.seriesToColumns ,
options : {
options : {
byField : 'time' ,
byField : 'time' ,
} ,
} ,
} ;
} ;
everySecondSeries . fields [ 0 ] . values = new ArrayVector ( everySecondSeries . fields [ 0 ] . values . toArray ( ) . reverse ( ) ) ;
everySecondSeries . fields [ 0 ] . values = new ArrayVector ( everySecondSeries . fields [ 0 ] . values . toArray ( ) . reverse ( ) ) ;
everySecondSeries . fields [ 1 ] . values = new ArrayVector ( everySecondSeries . fields [ 1 ] . values . toArray ( ) . reverse ( ) ) ;
everySecondSeries . fields [ 1 ] . values = new ArrayVector ( everySecondSeries . fields [ 1 ] . values . toArray ( ) . reverse ( ) ) ;
everySecondSeries . fields [ 2 ] . values = new ArrayVector ( everySecondSeries . fields [ 2 ] . values . toArray ( ) . reverse ( ) ) ;
everySecondSeries . fields [ 2 ] . values = new ArrayVector ( everySecondSeries . fields [ 2 ] . values . toArray ( ) . reverse ( ) ) ;
await expect ( transformDataFrame ( [ cfg ] , [ everySecondSeries , everyOtherSecondSeries ] ) ) . toEmitValuesWith (
await expect ( transformDataFrame ( [ cfg ] , [ everySecondSeries , everyOtherSecondSeries ] ) ) . toEmitValuesWith (
( received ) = > {
( received ) = > {
const data = received [ 0 ] ;
const data = received [ 0 ] ;
const filtered = data [ 0 ] ;
const filtered = data [ 0 ] ;
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
Array [
Array [
Object {
Object {
"config" : Object { } ,
"config" : Object { } ,
@ -352,40 +353,533 @@ describe('SeriesToColumns Transformer', () => {
} ,
} ,
]
]
` );
` );
}
}
) ;
) ;
} ) ;
describe ( 'Field names' , ( ) = > {
const seriesWithSameFieldAndDataFrameName = toDataFrame ( {
name : 'temperature' ,
fields : [
{ name : 'time' , type : FieldType . time , values : [ 1000 , 2000 , 3000 , 4000 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 1 , 3 , 5 , 7 ] } ,
] ,
} ) ;
const seriesB = toDataFrame ( {
name : 'B' ,
fields : [
{ name : 'time' , type : FieldType . time , values : [ 1000 , 2000 , 3000 , 4000 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 2 , 4 , 6 , 8 ] } ,
] ,
} ) ;
it ( 'when dataframe and field share the same name then use the field name' , async ( ) = > {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
id : DataTransformerID.seriesToColumns ,
options : {
byField : 'time' ,
} ,
} ;
await expect ( transformDataFrame ( [ cfg ] , [ seriesWithSameFieldAndDataFrameName , seriesB ] ) ) . toEmitValuesWith (
( received ) = > {
const data = received [ 0 ] ;
const filtered = data [ 0 ] ;
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
Array [
Object {
"config" : Object { } ,
"name" : "time" ,
"state" : Object { } ,
"type" : "time" ,
"values" : Array [
1000 ,
2000 ,
3000 ,
4000 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object {
"name" : "temperature" ,
} ,
"name" : "temperature" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
1 ,
3 ,
5 ,
7 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object {
"name" : "B" ,
} ,
"name" : "temperature" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
2 ,
4 ,
6 ,
8 ,
] ,
} ,
]
` );
}
) ;
} ) ;
} ) ;
it ( 'joins if fields are missing' , async ( ) = > {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
id : DataTransformerID.seriesToColumns ,
options : {
byField : 'time' ,
} ,
} ;
const frame1 = toDataFrame ( {
name : 'A' ,
fields : [
{ name : 'time' , type : FieldType . time , values : [ 1 , 2 , 3 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 10 , 11 , 12 ] } ,
] ,
} ) ;
const frame2 = toDataFrame ( {
name : 'B' ,
fields : [ ] ,
} ) ;
const frame3 = toDataFrame ( {
name : 'C' ,
fields : [
{ name : 'time' , type : FieldType . time , values : [ 1 , 2 , 3 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 20 , 22 , 24 ] } ,
] ,
} ) ;
await expect ( transformDataFrame ( [ cfg ] , [ frame1 , frame2 , frame3 ] ) ) . toEmitValuesWith ( ( received ) = > {
const data = received [ 0 ] ;
const filtered = data [ 0 ] ;
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
Array [
Object {
"config" : Object { } ,
"name" : "time" ,
"state" : Object { } ,
"type" : "time" ,
"values" : Array [
1 ,
2 ,
3 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object {
"name" : "A" ,
} ,
"name" : "temperature" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
10 ,
11 ,
12 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object {
"name" : "C" ,
} ,
"name" : "temperature" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
20 ,
22 ,
24 ,
] ,
} ,
]
` );
} ) ;
} ) ;
it ( 'handles duplicate field name' , async ( ) = > {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
id : DataTransformerID.seriesToColumns ,
options : {
byField : 'time' ,
} ,
} ;
const frame1 = toDataFrame ( {
fields : [
{ name : 'time' , type : FieldType . time , values : [ 1 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 10 ] } ,
] ,
} ) ;
const frame2 = toDataFrame ( {
fields : [
{ name : 'time' , type : FieldType . time , values : [ 1 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 20 ] } ,
] ,
} ) ;
await expect ( transformDataFrame ( [ cfg ] , [ frame1 , frame2 ] ) ) . toEmitValuesWith ( ( received ) = > {
const data = received [ 0 ] ;
const filtered = data [ 0 ] ;
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
Array [
Object {
"config" : Object { } ,
"name" : "time" ,
"state" : Object { } ,
"type" : "time" ,
"values" : Array [
1 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object { } ,
"name" : "temperature" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
10 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object { } ,
"name" : "temperature" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
20 ,
] ,
} ,
]
` );
} ) ;
} ) ;
} ) ;
} ) ;
describe ( 'Field names' , ( ) = > {
describe ( 'inner join ' , ( ) = > {
const seriesWithSameFieldAndDataFrameName = toDataFrame ( {
const seriesA = toDataFrame ( {
name : 'temperature' ,
name : 'A ' ,
fields : [
fields : [
{ name : 'time' , type : FieldType . time , values : [ 1000 , 2000 , 3000 , 4000 ] } ,
{ name : 'time' , type : FieldType . time , values : [ 3000 , 4000 , 5000 , 6000 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 1 , 3 , 5 , 7 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 10.3 , 10.4 , 10.5 , 10.6 ] } ,
{ name : 'humidity' , type : FieldType . number , values : [ 10000.3 , 10000.4 , 10000.5 , 10000.6 ] } ,
] ,
] ,
} ) ;
} ) ;
const seriesB = toDataFrame ( {
const seriesB = toDataFrame ( {
name : 'B' ,
name : 'B' ,
fields : [
fields : [
{ name : 'time' , type : FieldType . time , values : [ 1000 , 2000 , 3000 , 4000 ] } ,
{ name : 'time' , type : FieldType . time , values : [ 1000 , 3000 , 5000 , 7000 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 2 , 4 , 6 , 8 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 11.1 , 10.3 , 10.5 , 11.7 ] } ,
{ name : 'humidity' , type : FieldType . number , values : [ 11000.1 , 10000.3 , 10000.5 , 11000.7 ] } ,
] ,
] ,
} ) ;
} ) ;
it ( 'when dataframe and field share the same name then use the field name' , async ( ) = > {
it ( 'inner joins by time field ' , async ( ) = > {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
id : DataTransformerID.seriesToColumns ,
id : DataTransformerID.seriesToColumns ,
options : {
options : {
byField : 'time' ,
byField : 'time' ,
mode : JoinMode.inner ,
} ,
} ,
} ;
} ;
await expect ( transformDataFrame ( [ cfg ] , [ seriesWithSameFieldAndDataFrameName , seriesB ] ) ) . toEmitValuesWith (
await expect ( transformDataFrame ( [ cfg ] , [ seriesA , seriesB ] ) ) . toEmitValuesWith ( ( received ) = > {
( received ) = > {
const data = received [ 0 ] ;
const data = received [ 0 ] ;
const filtered = data [ 0 ] ;
const filtered = data [ 0 ] ;
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
Array [
Object {
"config" : Object { } ,
"name" : "time" ,
"state" : Object { } ,
"type" : "time" ,
"values" : Array [
3000 ,
5000 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object {
"name" : "A" ,
} ,
"name" : "temperature" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
10.3 ,
10.5 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object {
"name" : "A" ,
} ,
"name" : "humidity" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
10000.3 ,
10000.5 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object {
"name" : "B" ,
} ,
"name" : "temperature" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
10.3 ,
10.5 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object {
"name" : "B" ,
} ,
"name" : "humidity" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
10000.3 ,
10000.5 ,
] ,
} ,
]
` );
} ) ;
} ) ;
it ( 'inner joins by temperature field' , async ( ) = > {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
id : DataTransformerID.seriesToColumns ,
options : {
byField : 'temperature' ,
mode : JoinMode.inner ,
} ,
} ;
await expect ( transformDataFrame ( [ cfg ] , [ seriesA , seriesB ] ) ) . toEmitValuesWith ( ( received ) = > {
const data = received [ 0 ] ;
const filtered = data [ 0 ] ;
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
Array [
Object {
"config" : Object { } ,
"name" : "temperature" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
10.3 ,
10.5 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object {
"name" : "A" ,
} ,
"name" : "time" ,
"state" : Object {
"multipleFrames" : true ,
} ,
"type" : "time" ,
"values" : Array [
3000 ,
5000 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object {
"name" : "A" ,
} ,
"name" : "humidity" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
10000.3 ,
10000.5 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object {
"name" : "B" ,
} ,
"name" : "time" ,
"state" : Object {
"multipleFrames" : true ,
} ,
"type" : "time" ,
"values" : Array [
3000 ,
5000 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object {
"name" : "B" ,
} ,
"name" : "humidity" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
10000.3 ,
10000.5 ,
] ,
} ,
]
` );
} ) ;
} ) ;
it ( 'inner joins by time field in reverse order' , async ( ) = > {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
id : DataTransformerID.seriesToColumns ,
options : {
byField : 'time' ,
mode : JoinMode.inner ,
} ,
} ;
seriesA . fields [ 0 ] . values = new ArrayVector ( seriesA . fields [ 0 ] . values . toArray ( ) . reverse ( ) ) ;
seriesA . fields [ 1 ] . values = new ArrayVector ( seriesA . fields [ 1 ] . values . toArray ( ) . reverse ( ) ) ;
seriesA . fields [ 2 ] . values = new ArrayVector ( seriesA . fields [ 2 ] . values . toArray ( ) . reverse ( ) ) ;
await expect ( transformDataFrame ( [ cfg ] , [ seriesA , seriesB ] ) ) . toEmitValuesWith ( ( received ) = > {
const data = received [ 0 ] ;
const filtered = data [ 0 ] ;
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
Array [
Object {
"config" : Object { } ,
"name" : "time" ,
"state" : Object {
"multipleFrames" : true ,
} ,
"type" : "time" ,
"values" : Array [
3000 ,
5000 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object {
"name" : "A" ,
} ,
"name" : "temperature" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
10.3 ,
10.5 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object {
"name" : "A" ,
} ,
"name" : "humidity" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
10000.3 ,
10000.5 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object {
"name" : "B" ,
} ,
"name" : "temperature" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
10.3 ,
10.5 ,
] ,
} ,
Object {
"config" : Object { } ,
"labels" : Object {
"name" : "B" ,
} ,
"name" : "humidity" ,
"state" : Object { } ,
"type" : "number" ,
"values" : Array [
10000.3 ,
10000.5 ,
] ,
} ,
]
` );
} ) ;
} ) ;
describe ( 'Field names' , ( ) = > {
const seriesWithSameFieldAndDataFrameName = toDataFrame ( {
name : 'temperature' ,
fields : [
{ name : 'time' , type : FieldType . time , values : [ 1000 , 2000 , 3000 , 4000 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 1 , 3 , 5 , 7 ] } ,
] ,
} ) ;
const seriesB = toDataFrame ( {
name : 'B' ,
fields : [
{ name : 'time' , type : FieldType . time , values : [ 1000 , 2000 , 3000 , 4000 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 2 , 4 , 6 , 8 ] } ,
] ,
} ) ;
it ( 'when dataframe and field share the same name then use the field name' , async ( ) = > {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
id : DataTransformerID.seriesToColumns ,
options : {
byField : 'time' ,
mode : JoinMode.inner ,
} ,
} ;
await expect ( transformDataFrame ( [ cfg ] , [ seriesWithSameFieldAndDataFrameName , seriesB ] ) ) . toEmitValuesWith (
( received ) = > {
const data = received [ 0 ] ;
const filtered = data [ 0 ] ;
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
Array [
Array [
Object {
Object {
"config" : Object { } ,
"config" : Object { } ,
@ -431,44 +925,45 @@ describe('SeriesToColumns Transformer', () => {
} ,
} ,
]
]
` );
` );
}
}
) ;
) ;
} ) ;
} ) ;
} ) ;
} ) ;
it ( 'joins if fields are missing' , async ( ) = > {
it ( 'joins if fields are missing' , async ( ) = > {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
id : DataTransformerID.seriesToColumns ,
id : DataTransformerID.seriesToColumns ,
options : {
options : {
byField : 'time' ,
byField : 'time' ,
} ,
mode : JoinMode.inner ,
} ;
} ,
} ;
const frame1 = toDataFrame ( {
const frame1 = toDataFrame ( {
name : 'A' ,
name : 'A' ,
fields : [
fields : [
{ name : 'time' , type : FieldType . time , values : [ 1 , 2 , 3 ] } ,
{ name : 'time' , type : FieldType . time , values : [ 1 , 2 , 3 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 10 , 11 , 12 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 10 , 11 , 12 ] } ,
] ,
] ,
} ) ;
} ) ;
const frame2 = toDataFrame ( {
const frame2 = toDataFrame ( {
name : 'B' ,
name : 'B' ,
fields : [ ] ,
fields : [ ] ,
} ) ;
} ) ;
const frame3 = toDataFrame ( {
const frame3 = toDataFrame ( {
name : 'C' ,
name : 'C' ,
fields : [
fields : [
{ name : 'time' , type : FieldType . time , values : [ 1 , 2 , 3 ] } ,
{ name : 'time' , type : FieldType . time , values : [ 1 , 2 , 3 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 20 , 22 , 24 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 20 , 22 , 24 ] } ,
] ,
] ,
} ) ;
} ) ;
await expect ( transformDataFrame ( [ cfg ] , [ frame1 , frame2 , frame3 ] ) ) . toEmitValuesWith ( ( received ) = > {
await expect ( transformDataFrame ( [ cfg ] , [ frame1 , frame2 , frame3 ] ) ) . toEmitValuesWith ( ( received ) = > {
const data = received [ 0 ] ;
const data = received [ 0 ] ;
const filtered = data [ 0 ] ;
const filtered = data [ 0 ] ;
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
Array [
Array [
Object {
Object {
"config" : Object { } ,
"config" : Object { } ,
@ -511,35 +1006,36 @@ describe('SeriesToColumns Transformer', () => {
} ,
} ,
]
]
` );
` );
} ) ;
} ) ;
} ) ;
} ) ;
it ( 'handles duplicate field name' , async ( ) = > {
it ( 'handles duplicate field name' , async ( ) = > {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
const cfg : DataTransformerConfig < SeriesToColumnsOptions > = {
id : DataTransformerID.seriesToColumns ,
id : DataTransformerID.seriesToColumns ,
options : {
options : {
byField : 'time' ,
byField : 'time' ,
} ,
mode : JoinMode.inner ,
} ;
} ,
} ;
const frame1 = toDataFrame ( {
const frame1 = toDataFrame ( {
fields : [
fields : [
{ name : 'time' , type : FieldType . time , values : [ 1 ] } ,
{ name : 'time' , type : FieldType . time , values : [ 1 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 10 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 10 ] } ,
] ,
] ,
} ) ;
} ) ;
const frame2 = toDataFrame ( {
const frame2 = toDataFrame ( {
fields : [
fields : [
{ name : 'time' , type : FieldType . time , values : [ 1 ] } ,
{ name : 'time' , type : FieldType . time , values : [ 1 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 20 ] } ,
{ name : 'temperature' , type : FieldType . number , values : [ 20 ] } ,
] ,
] ,
} ) ;
} ) ;
await expect ( transformDataFrame ( [ cfg ] , [ frame1 , frame2 ] ) ) . toEmitValuesWith ( ( received ) = > {
await expect ( transformDataFrame ( [ cfg ] , [ frame1 , frame2 ] ) ) . toEmitValuesWith ( ( received ) = > {
const data = received [ 0 ] ;
const data = received [ 0 ] ;
const filtered = data [ 0 ] ;
const filtered = data [ 0 ] ;
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
expect ( filtered . fields ) . toMatchInlineSnapshot ( `
Array [
Array [
Object {
Object {
"config" : Object { } ,
"config" : Object { } ,
@ -572,6 +1068,7 @@ describe('SeriesToColumns Transformer', () => {
} ,
} ,
]
]
` );
` );
} ) ;
} ) ;
} ) ;
} ) ;
} ) ;
} ) ;
} ) ;