github.com/siglens/siglens@v0.0.0-20240328180423-f7ce9ae441ed/pkg/ast/logql/logqlParse_test.go (about)

     1  /*
     2  Copyright 2023.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package logql
    18  
    19  import (
    20  	"os"
    21  	"testing"
    22  
    23  	"github.com/siglens/siglens/pkg/ast"
    24  	"github.com/siglens/siglens/pkg/segment/structs"
    25  	"github.com/stretchr/testify/assert"
    26  )
    27  
    28  func Test_ParseStream(t *testing.T) {
    29  	json_body := []byte(`{something="another"}`)
    30  	res, err := Parse("", json_body)
    31  	queryJson := res.(ast.QueryStruct).SearchFilter
    32  	assert.Nil(t, err)
    33  	assert.NotNil(t, queryJson)
    34  	assert.Equal(t, queryJson.Comparison.Field, "something")
    35  	assert.Equal(t, queryJson.Comparison.Values, "\"another\"")
    36  	assert.Equal(t, queryJson.Comparison.Op, "=")
    37  
    38  	json_body = []byte(`{something="another", another="thing"}`)
    39  	res, err = Parse("", json_body)
    40  	queryJson = res.(ast.QueryStruct).SearchFilter
    41  	assert.Nil(t, err)
    42  	assert.NotNil(t, queryJson)
    43  	assert.Equal(t, queryJson.Left.Comparison.Field, "something")
    44  	assert.Equal(t, queryJson.Left.Comparison.Values, "\"another\"")
    45  	assert.Equal(t, queryJson.Right.Comparison.Field, "another")
    46  	assert.Equal(t, queryJson.Right.Comparison.Values, "\"thing\"")
    47  	assert.Equal(t, queryJson.NodeType, ast.NodeAnd)
    48  }
    49  
    50  func Test_ParseFile(t *testing.T) {
    51  	tempFile, err := os.CreateTemp("", "test.log")
    52  	assert.Nil(t, err)
    53  	defer os.Remove(tempFile.Name())
    54  
    55  	testContent := []byte(`{something="another"} | another >= thing`)
    56  	_, err = tempFile.Write(testContent)
    57  	assert.Nil(t, err)
    58  
    59  	res, err := ParseFile(tempFile.Name())
    60  	assert.Nil(t, err)
    61  	queryJson := res.(ast.QueryStruct).SearchFilter
    62  	assert.Equal(t, queryJson.Left.Comparison.Field, "something")
    63  	assert.Equal(t, queryJson.Left.Comparison.Values, "\"another\"")
    64  	assert.Equal(t, queryJson.Right.Comparison.Field, "another")
    65  	assert.Equal(t, queryJson.Right.Comparison.Values, "thing")
    66  }
    67  
    68  func Test_ParseLabelFilter(t *testing.T) {
    69  	json_body := []byte(`{something="another"} | another >= thing`)
    70  	res, err := Parse("", json_body)
    71  	queryJson := res.(ast.QueryStruct).SearchFilter
    72  	assert.Nil(t, err)
    73  	assert.Equal(t, queryJson.Left.Comparison.Field, "something")
    74  	assert.Equal(t, queryJson.Left.Comparison.Values, "\"another\"")
    75  	assert.Equal(t, queryJson.Right.Comparison.Field, "another")
    76  	assert.Equal(t, queryJson.Right.Comparison.Values, "thing")
    77  }
    78  
    79  func Test_ParseLogFilter(t *testing.T) {
    80  	json_body := []byte(`{gender="female",city="Fresno"} != "batch-212"`)
    81  	res, err := Parse("", json_body)
    82  	queryJson := res.(ast.QueryStruct).SearchFilter
    83  	assert.Nil(t, err)
    84  	assert.Equal(t, queryJson.Right.Comparison.Values, ast.GrepValue{Field: "\"batch-212\""})
    85  	assert.Equal(t, queryJson.Left.Right.Comparison.Values, "\"Fresno\"")
    86  	assert.Equal(t, queryJson.Left.Left.Comparison.Values, "\"female\"")
    87  }
    88  
    89  func Test_ParseLogAndLabelFilter(t *testing.T) {
    90  	json_body := []byte(`{gender="female",city="Fresno"} |= "batch-212" | another >= thing`)
    91  	res, err := Parse("", json_body)
    92  	queryJson := res.(ast.QueryStruct).SearchFilter
    93  	assert.Nil(t, err)
    94  	assert.Equal(t, queryJson.Right.Right.Comparison.Values, "thing")
    95  	assert.Equal(t, queryJson.Right.Left.Comparison.Values, ast.GrepValue{Field: "\"batch-212\""})
    96  	assert.Equal(t, queryJson.Left.Right.Comparison.Values, "\"Fresno\"")
    97  	assert.Equal(t, queryJson.Left.Left.Comparison.Values, "\"female\"")
    98  }
    99  
   100  func Test_ParseJSONKeyword(t *testing.T) {
   101  	json_body := []byte(`{gender="female",city="Fresno"} | json city_life="city", single_gender="gender[0]"`)
   102  	res, err := Parse("", json_body)
   103  	queryJson := res.(ast.QueryStruct).SearchFilter
   104  	pipeCommands := res.(ast.QueryStruct).PipeCommands
   105  	testOutputColumns := append(make([]string, 0), "city", "gender")
   106  	testRenameColumns := make(map[string]string)
   107  	testRenameColumns["city"] = "city_life"
   108  	testIncludeValues := append(make([]*structs.IncludeValue, 0), &structs.IncludeValue{Index: 0, ColName: "gender", Label: "single_gender"})
   109  	assert.Nil(t, err)
   110  	assert.Equal(t, pipeCommands.OutputTransforms.OutputColumns.IncludeColumns, testOutputColumns)
   111  	assert.Equal(t, pipeCommands.OutputTransforms.OutputColumns.RenameColumns, testRenameColumns)
   112  	assert.Equal(t, pipeCommands.OutputTransforms.OutputColumns.IncludeValues, testIncludeValues)
   113  	assert.Equal(t, queryJson.Left.Comparison.Values, "\"female\"")
   114  	assert.Equal(t, queryJson.Right.Comparison.Values, "\"Fresno\"")
   115  
   116  	json_body = []byte(`{gender="female"} | json `)
   117  	res, err = Parse("", json_body)
   118  	pipeCommands = res.(ast.QueryStruct).PipeCommands
   119  	queryJson = res.(ast.QueryStruct).SearchFilter
   120  	assert.Nil(t, err)
   121  	assert.Equal(t, queryJson.Comparison.Values, "\"female\"")
   122  	assert.Nil(t, pipeCommands)
   123  }
   124  
   125  func Test_ParseJSONKeywordAndFilters(t *testing.T) {
   126  	json_body := []byte(`{gender="female",city="Fresno"} | json city_life="city", single_gender="gender[0]" |= "batch-212"`)
   127  	res, err := Parse("", json_body)
   128  	queryJson := res.(ast.QueryStruct).SearchFilter
   129  	pipeCommands := res.(ast.QueryStruct).PipeCommands
   130  	testOutputColumns := append(make([]string, 0), "city", "gender")
   131  	testRenameColumns := make(map[string]string)
   132  	testRenameColumns["city"] = "city_life"
   133  	testIncludeValues := append(make([]*structs.IncludeValue, 0), &structs.IncludeValue{Index: 0, ColName: "gender", Label: "single_gender"})
   134  	assert.Nil(t, err)
   135  	assert.Equal(t, pipeCommands.OutputTransforms.OutputColumns.IncludeColumns, testOutputColumns)
   136  	assert.Equal(t, pipeCommands.OutputTransforms.OutputColumns.RenameColumns, testRenameColumns)
   137  	assert.Equal(t, pipeCommands.OutputTransforms.OutputColumns.IncludeValues, testIncludeValues)
   138  	assert.Equal(t, queryJson.Left.Left.Comparison.Values, "\"female\"")
   139  	assert.Equal(t, queryJson.Left.Right.Comparison.Values, "\"Fresno\"")
   140  	assert.Equal(t, queryJson.Right.Comparison.Values, ast.GrepValue{Field: "\"batch-212\""})
   141  
   142  	json_body = []byte(`{gender="female",city="Fresno"} | json city_life="city", single_gender="gender[0]" |= "batch-212" | another >= thing`)
   143  	res, err = Parse("", json_body)
   144  	queryJson = res.(ast.QueryStruct).SearchFilter
   145  	pipeCommands = res.(ast.QueryStruct).PipeCommands
   146  	assert.Nil(t, err)
   147  	assert.Equal(t, pipeCommands.OutputTransforms.OutputColumns.IncludeColumns, testOutputColumns)
   148  	assert.Equal(t, pipeCommands.OutputTransforms.OutputColumns.RenameColumns, testRenameColumns)
   149  	assert.Equal(t, pipeCommands.OutputTransforms.OutputColumns.IncludeValues, testIncludeValues)
   150  	assert.Equal(t, queryJson.Left.Left.Comparison.Values, "\"female\"")
   151  	assert.Equal(t, queryJson.Left.Right.Comparison.Values, "\"Fresno\"")
   152  	assert.Equal(t, queryJson.Right.Left.Comparison.Values, ast.GrepValue{Field: "\"batch-212\""})
   153  	assert.Equal(t, queryJson.Right.Right.Comparison.Values, "thing")
   154  
   155  }
   156  
   157  func Test_RangeMetrics(t *testing.T) {
   158  	json_body := []byte(`count_over_time({gender="male"}[90d])`)
   159  	res, err := Parse("", json_body)
   160  	queryJson := res.(ast.QueryStruct).SearchFilter
   161  	pipeCommands := res.(ast.QueryStruct).PipeCommands
   162  	assert.Nil(t, err)
   163  	assert.Equal(t, pipeCommands.GroupByRequest.GroupByColumns, []string{"*"})
   164  	assert.Equal(t, queryJson.Comparison.Field, "gender")
   165  	assert.Equal(t, queryJson.Comparison.Values, "\"male\"")
   166  	assert.Equal(t, queryJson.Comparison.Op, "=")
   167  }