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 }