@@ -1111,7 +1111,7 @@ func (s *DatasourceTestSuite) TestGenerateDataFrameWithMultipleDataTypes() {
11111111 },
11121112 }
11131113
1114- frame , err := generateDataFrame (responseData , nil , false )
1114+ frame , err := generateDataFrame (responseData , nil , false , EnumDisplayBoth )
11151115 s .NoError (err )
11161116
11171117 // Verify frame structure
@@ -1179,7 +1179,7 @@ func (s *DatasourceTestSuite) TestGenerateDataFrameHandlesCalculatedChannels() {
11791179 },
11801180 }
11811181
1182- frame , err := generateDataFrame (responseData , calculatedChannelKeys , false )
1182+ frame , err := generateDataFrame (responseData , calculatedChannelKeys , false , EnumDisplayBoth )
11831183 s .NoError (err )
11841184
11851185 // Verify frame structure
@@ -1232,7 +1232,7 @@ func (s *DatasourceTestSuite) TestGenerateDataFrameHandlesGroupByRun() {
12321232 },
12331233 }
12341234
1235- frame , err := generateDataFrame (responseData , nil , false )
1235+ frame , err := generateDataFrame (responseData , nil , false , EnumDisplayBoth )
12361236 s .NoError (err )
12371237
12381238 // Verify frame structure
@@ -1944,3 +1944,222 @@ func (s *DatasourceTestSuite) channelsMatch(expected, actual *siftApiChannel) bo
19441944 }
19451945 return true
19461946}
1947+
1948+ func (s * DatasourceTestSuite ) TestGenerateDataFrameWithEnumDisplayBoth () {
1949+ now := time .Now ()
1950+ responseData := []queryResponseData {
1951+ {
1952+ Metadata : queryResponseMetadata {
1953+ DataType : "CHANNEL_DATA_TYPE_ENUM" ,
1954+ Asset : struct {
1955+ AssetId string "json:\" assetId\" "
1956+ Name string "json:\" name\" "
1957+ }{
1958+ AssetId : "asset1" ,
1959+ Name : "Asset 1" ,
1960+ },
1961+ Channel : struct {
1962+ ChannelId string "json:\" channelId\" "
1963+ Name string "json:\" name\" "
1964+ EnumTypes []queryResponseChannelEnumType "json:\" enumTypes\" "
1965+ BitFieldElements []queryResponseChannelBitFieldElement "json:\" bitFieldElements\" "
1966+ }{
1967+ ChannelId : "channel1" ,
1968+ Name : "Status" ,
1969+ EnumTypes : []queryResponseChannelEnumType {
1970+ {Name : "ACTIVE" , Key : 1 },
1971+ {Name : "INACTIVE" , Key : 2 },
1972+ },
1973+ },
1974+ },
1975+ Values : json .RawMessage (`[
1976+ {"timestamp": "` + now .Format (time .RFC3339Nano ) + `", "value": 1},
1977+ {"timestamp": "` + now .Add (time .Second ).Format (time .RFC3339Nano ) + `", "value": 2}
1978+ ]` ),
1979+ },
1980+ }
1981+
1982+ frame , err := generateDataFrame (responseData , nil , true , EnumDisplayBoth )
1983+ s .NoError (err )
1984+
1985+ // Verify frame structure - should have both _string and _value fields
1986+ s .Equal (3 , len (frame .Fields ))
1987+ s .Equal ("time" , frame .Fields [0 ].Name )
1988+ s .Equal ("Status_string" , frame .Fields [1 ].Name )
1989+ s .Equal ("Status_value" , frame .Fields [2 ].Name )
1990+
1991+ // Verify enum string values
1992+ s .Equal ("ACTIVE" , * frame .Fields [1 ].At (0 ).(* string ))
1993+ s .Equal ("INACTIVE" , * frame .Fields [1 ].At (1 ).(* string ))
1994+
1995+ // Verify enum numeric values
1996+ s .Equal (uint32 (1 ), * frame .Fields [2 ].At (0 ).(* uint32 ))
1997+ s .Equal (uint32 (2 ), * frame .Fields [2 ].At (1 ).(* uint32 ))
1998+ }
1999+
2000+ func (s * DatasourceTestSuite ) TestGenerateDataFrameWithEnumDisplayString () {
2001+ now := time .Now ()
2002+ responseData := []queryResponseData {
2003+ {
2004+ Metadata : queryResponseMetadata {
2005+ DataType : "CHANNEL_DATA_TYPE_ENUM" ,
2006+ Asset : struct {
2007+ AssetId string "json:\" assetId\" "
2008+ Name string "json:\" name\" "
2009+ }{
2010+ AssetId : "asset1" ,
2011+ Name : "Asset 1" ,
2012+ },
2013+ Channel : struct {
2014+ ChannelId string "json:\" channelId\" "
2015+ Name string "json:\" name\" "
2016+ EnumTypes []queryResponseChannelEnumType "json:\" enumTypes\" "
2017+ BitFieldElements []queryResponseChannelBitFieldElement "json:\" bitFieldElements\" "
2018+ }{
2019+ ChannelId : "channel1" ,
2020+ Name : "Status" ,
2021+ EnumTypes : []queryResponseChannelEnumType {
2022+ {Name : "ACTIVE" , Key : 1 },
2023+ {Name : "INACTIVE" , Key : 2 },
2024+ },
2025+ },
2026+ },
2027+ Values : json .RawMessage (`[
2028+ {"timestamp": "` + now .Format (time .RFC3339Nano ) + `", "value": 1},
2029+ {"timestamp": "` + now .Add (time .Second ).Format (time .RFC3339Nano ) + `", "value": 2}
2030+ ]` ),
2031+ },
2032+ }
2033+
2034+ frame , err := generateDataFrame (responseData , nil , true , EnumDisplayString )
2035+ s .NoError (err )
2036+
2037+ // Verify frame structure - should only have string field without suffix
2038+ s .Equal (2 , len (frame .Fields ))
2039+ s .Equal ("time" , frame .Fields [0 ].Name )
2040+ s .Equal ("Status" , frame .Fields [1 ].Name ) // No _string suffix
2041+
2042+ // Verify enum string values
2043+ s .Equal ("ACTIVE" , * frame .Fields [1 ].At (0 ).(* string ))
2044+ s .Equal ("INACTIVE" , * frame .Fields [1 ].At (1 ).(* string ))
2045+ }
2046+
2047+ func (s * DatasourceTestSuite ) TestGenerateDataFrameWithEnumDisplayValue () {
2048+ now := time .Now ()
2049+ responseData := []queryResponseData {
2050+ {
2051+ Metadata : queryResponseMetadata {
2052+ DataType : "CHANNEL_DATA_TYPE_ENUM" ,
2053+ Asset : struct {
2054+ AssetId string "json:\" assetId\" "
2055+ Name string "json:\" name\" "
2056+ }{
2057+ AssetId : "asset1" ,
2058+ Name : "Asset 1" ,
2059+ },
2060+ Channel : struct {
2061+ ChannelId string "json:\" channelId\" "
2062+ Name string "json:\" name\" "
2063+ EnumTypes []queryResponseChannelEnumType "json:\" enumTypes\" "
2064+ BitFieldElements []queryResponseChannelBitFieldElement "json:\" bitFieldElements\" "
2065+ }{
2066+ ChannelId : "channel1" ,
2067+ Name : "Status" ,
2068+ EnumTypes : []queryResponseChannelEnumType {
2069+ {Name : "ACTIVE" , Key : 1 },
2070+ {Name : "INACTIVE" , Key : 2 },
2071+ },
2072+ },
2073+ },
2074+ Values : json .RawMessage (`[
2075+ {"timestamp": "` + now .Format (time .RFC3339Nano ) + `", "value": 1},
2076+ {"timestamp": "` + now .Add (time .Second ).Format (time .RFC3339Nano ) + `", "value": 2}
2077+ ]` ),
2078+ },
2079+ }
2080+
2081+ frame , err := generateDataFrame (responseData , nil , true , EnumDisplayValue )
2082+ s .NoError (err )
2083+
2084+ // Verify frame structure - should only have value field without suffix
2085+ s .Equal (2 , len (frame .Fields ))
2086+ s .Equal ("time" , frame .Fields [0 ].Name )
2087+ s .Equal ("Status" , frame .Fields [1 ].Name ) // No _value suffix
2088+
2089+ // Verify enum numeric values
2090+ s .Equal (uint32 (1 ), * frame .Fields [1 ].At (0 ).(* uint32 ))
2091+ s .Equal (uint32 (2 ), * frame .Fields [1 ].At (1 ).(* uint32 ))
2092+ }
2093+
2094+ func (s * DatasourceTestSuite ) TestGenerateDataFrameWithEnumDisplayMixedChannels () {
2095+ now := time .Now ()
2096+ responseData := []queryResponseData {
2097+ {
2098+ Metadata : queryResponseMetadata {
2099+ DataType : "CHANNEL_DATA_TYPE_ENUM" ,
2100+ Asset : struct {
2101+ AssetId string "json:\" assetId\" "
2102+ Name string "json:\" name\" "
2103+ }{
2104+ AssetId : "asset1" ,
2105+ Name : "Asset 1" ,
2106+ },
2107+ Channel : struct {
2108+ ChannelId string "json:\" channelId\" "
2109+ Name string "json:\" name\" "
2110+ EnumTypes []queryResponseChannelEnumType "json:\" enumTypes\" "
2111+ BitFieldElements []queryResponseChannelBitFieldElement "json:\" bitFieldElements\" "
2112+ }{
2113+ ChannelId : "channel1" ,
2114+ Name : "Status" ,
2115+ EnumTypes : []queryResponseChannelEnumType {
2116+ {Name : "ON" , Key : 1 },
2117+ {Name : "OFF" , Key : 2 },
2118+ },
2119+ },
2120+ },
2121+ Values : json .RawMessage (`[
2122+ {"timestamp": "` + now .Format (time .RFC3339Nano ) + `", "value": 1}
2123+ ]` ),
2124+ },
2125+ {
2126+ Metadata : queryResponseMetadata {
2127+ DataType : "CHANNEL_DATA_TYPE_DOUBLE" ,
2128+ Asset : struct {
2129+ AssetId string "json:\" assetId\" "
2130+ Name string "json:\" name\" "
2131+ }{
2132+ AssetId : "asset1" ,
2133+ Name : "Asset 1" ,
2134+ },
2135+ Channel : struct {
2136+ ChannelId string "json:\" channelId\" "
2137+ Name string "json:\" name\" "
2138+ EnumTypes []queryResponseChannelEnumType "json:\" enumTypes\" "
2139+ BitFieldElements []queryResponseChannelBitFieldElement "json:\" bitFieldElements\" "
2140+ }{
2141+ ChannelId : "channel2" ,
2142+ Name : "Temperature" ,
2143+ },
2144+ },
2145+ Values : json .RawMessage (`[
2146+ {"timestamp": "` + now .Format (time .RFC3339Nano ) + `", "value": 23.5}
2147+ ]` ),
2148+ },
2149+ }
2150+
2151+ frame , err := generateDataFrame (responseData , nil , true , EnumDisplayString )
2152+ s .NoError (err )
2153+
2154+ // Verify frame structure - enum should be filtered, non-enum should remain
2155+ s .Equal (3 , len (frame .Fields ))
2156+ s .Equal ("time" , frame .Fields [0 ].Name )
2157+ s .Equal ("Status" , frame .Fields [1 ].Name ) // Enum without suffix
2158+ s .Equal ("Temperature" , frame .Fields [2 ].Name ) // Non-enum unchanged
2159+
2160+ // Verify enum string value
2161+ s .Equal ("ON" , * frame .Fields [1 ].At (0 ).(* string ))
2162+
2163+ // Verify temperature value
2164+ s .Equal (23.5 , * frame .Fields [2 ].At (0 ).(* float64 ))
2165+ }
0 commit comments