Skip to content

Commit

Permalink
feat: show tag value command support order by clause
Browse files Browse the repository at this point in the history
Signed-off-by: Young Xu <xuthus5@gmail.com>
  • Loading branch information
xuthus5 committed Dec 30, 2024
1 parent f19dc1d commit ed8804e
Show file tree
Hide file tree
Showing 2 changed files with 123 additions and 23 deletions.
134 changes: 111 additions & 23 deletions opengemini/command_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -177,34 +177,36 @@ func TestClient_ShowTagValues(t *testing.T) {
}
time.Sleep(time.Second * 5)

// SHOW TAG VALUES FROM measurement WITH KEY = location
// SHOW TAG VALUES FROM measurement WITH KEY = location ORDER BY location ASC
tagValueResult, err := c.ShowTagValues(NewShowTagValuesBuilder().Database(databaseName).Measurement(measurement).
With("location"))
With("location").OrderBy("location", Asc))
assert.Nil(t, err)
assert.Equal(t, 4, len(tagValueResult))
expValues := []string{"c1", "c2", "u1", "u2"}
sort.Strings(expValues)
sort.Strings(tagValueResult)
assert.EqualValues(t, expValues, tagValueResult)

// SHOW TAG VALUES FROM measurement WITH KEY = location ORDER BY location DESC
tagValueResult, err = c.ShowTagValues(NewShowTagValuesBuilder().Database(databaseName).Measurement(measurement).
With("location").OrderBy("location", Desc))
assert.Nil(t, err)
assert.Equal(t, 4, len(tagValueResult))
expValues = []string{"u2", "u1", "c2", "c1"}
assert.EqualValues(t, expValues, tagValueResult)

// SHOW TAG VALUES FROM measurement WITH KEY = location LIMIT 2 OFFSET 0
tagValueResult, err = c.ShowTagValues(NewShowTagValuesBuilder().Database(databaseName).Measurement(measurement).
With("location").Limit(2).Offset(0))
With("location").Limit(2).Offset(0).OrderBy("location", Asc))
assert.Nil(t, err)
assert.Equal(t, 2, len(tagValueResult))
expValues = []string{"c1", "c2"}
sort.Strings(expValues)
sort.Strings(tagValueResult)
assert.EqualValues(t, expValues, tagValueResult)

// SHOW TAG VALUES FROM measurement WITH KEY = location LIMIT 2 OFFSET 2
tagValueResult, err = c.ShowTagValues(NewShowTagValuesBuilder().Database(databaseName).Measurement(measurement).
With("location").Limit(2).Offset(2))
With("location").Limit(2).Offset(2).OrderBy("location", Asc))
assert.Nil(t, err)
assert.Equal(t, 2, len(tagValueResult))
expValues = []string{"u1", "u2"}
sort.Strings(expValues)
sort.Strings(tagValueResult)
assert.EqualValues(t, expValues, tagValueResult)

// SHOW TAG VALUES FROM measurement WITH KEY = location LIMIT 2 OFFSET 2 WHERE country = cn
Expand Down Expand Up @@ -281,34 +283,36 @@ func TestClient_ShowTagValues_WithRegexp(t *testing.T) {
}
time.Sleep(time.Second * 5)

// SHOW TAG VALUES FROM measurement WITH KEY = /loc.*/
// SHOW TAG VALUES FROM measurement WITH KEY = /loc.*/ order by location ASC
tagValueResult, err := c.ShowTagValues(NewShowTagValuesBuilder().Database(databaseName).Measurement(measurement).
With("/loc.*/"))
With("/loc.*/").OrderBy("location", Asc))
assert.Nil(t, err)
assert.Equal(t, 4, len(tagValueResult))
expValues := []string{"c1", "c2", "u1", "u2"}
sort.Strings(expValues)
sort.Strings(tagValueResult)
assert.EqualValues(t, expValues, tagValueResult)

// SHOW TAG VALUES FROM measurement WITH KEY = /loc.*/ order by location ASC
tagValueResult, err = c.ShowTagValues(NewShowTagValuesBuilder().Database(databaseName).Measurement(measurement).
With("/loc.*/").OrderBy("location", Desc))
assert.Nil(t, err)
assert.Equal(t, 4, len(tagValueResult))
expValues = []string{"u2", "u1", "c2", "c1"}
assert.EqualValues(t, expValues, tagValueResult)

// SHOW TAG VALUES FROM measurement WITH KEY = /loc./ LIMIT 2 OFFSET 0
tagValueResult, err = c.ShowTagValues(NewShowTagValuesBuilder().Database(databaseName).Measurement(measurement).
With("/loc.*/").Limit(2).Offset(0))
With("/loc.*/").Limit(2).Offset(0).OrderBy("location", Asc))
assert.Nil(t, err)
assert.Equal(t, 2, len(tagValueResult))
expValues = []string{"c1", "c2"}
sort.Strings(expValues)
sort.Strings(tagValueResult)
assert.EqualValues(t, expValues, tagValueResult)

// SHOW TAG VALUES FROM measurement WITH KEY = /loc./ LIMIT 2 OFFSET 2
tagValueResult, err = c.ShowTagValues(NewShowTagValuesBuilder().Database(databaseName).Measurement(measurement).
With("/loc.*/").Limit(2).Offset(2))
With("/loc.*/").Limit(2).Offset(2).OrderBy("location", Asc))
assert.Nil(t, err)
assert.Equal(t, 2, len(tagValueResult))
expValues = []string{"u1", "u2"}
sort.Strings(expValues)
sort.Strings(tagValueResult)
assert.EqualValues(t, expValues, tagValueResult)

// SHOW TAG VALUES FROM measurement WITH KEY = /loc./ LIMIT 2 OFFSET 2 WHERE country = cn
Expand Down Expand Up @@ -387,7 +391,7 @@ func TestClient_ShowTagValues_WithIn(t *testing.T) {

// SHOW TAG VALUES FROM measurement WITH KEY IN (location, country)
tagValueResult, err := c.ShowTagValues(NewShowTagValuesBuilder().Database(databaseName).Measurement(measurement).
With("location", "country"))
With("location", "country").OrderBy("location", Asc).OrderBy("country", Asc))
assert.Nil(t, err)
assert.Equal(t, 6, len(tagValueResult))
expValues := []string{"c1", "c2", "u1", "u2", "cn", "us"}
Expand All @@ -397,13 +401,13 @@ func TestClient_ShowTagValues_WithIn(t *testing.T) {

// SHOW TAG VALUES FROM measurement WITH KEY IN (location, country) LIMIT 2 OFFSET 0
tagValueResult, err = c.ShowTagValues(NewShowTagValuesBuilder().Database(databaseName).Measurement(measurement).
With("location", "country").Limit(2).Offset(0))
With("location", "country").Limit(2).Offset(0).OrderBy("location", Asc))
assert.Nil(t, err)
assert.Equal(t, 2, len(tagValueResult))

// SHOW TAG VALUES FROM measurement WITH KEY IN (location, country) LIMIT 2 OFFSET 2
tagValueResult, err = c.ShowTagValues(NewShowTagValuesBuilder().Database(databaseName).Measurement(measurement).
With("location", "country").Limit(2).Offset(2))
With("location", "country").Limit(2).Offset(2).OrderBy("location", Asc))
assert.Nil(t, err)
assert.Equal(t, 2, len(tagValueResult))

Expand All @@ -421,6 +425,90 @@ func TestClient_ShowTagValues_Error_NoWithKey(t *testing.T) {
assert.Equal(t, ErrEmptyTagKey, err)
}

func TestClient_ShowTagValues_OrderBy(t *testing.T) {
c := testDefaultClient(t)
databaseName := randomDatabaseName()
err := c.CreateDatabase(databaseName)
require.Nil(t, err)
measurement := randomMeasurement()
defer func() {
err := c.DropDatabase(databaseName)
assert.Nil(t, err)
}()
callback := func(err error) {
assert.Nil(t, err)
}

points := []*Point{
{
Measurement: measurement,
Tags: map[string]string{
"location": "c1",
"country": "cn",
},
Fields: map[string]interface{}{
"weather": "sun",
"temperature": 25.0,
},
},
{
Measurement: measurement,
Tags: map[string]string{
"location": "c2",
"country": "cn",
},
Fields: map[string]interface{}{
"weather": "sun",
"temperature": 26.0,
},
},
{
Measurement: measurement,
Tags: map[string]string{
"location": "u1",
"country": "us",
},
Fields: map[string]interface{}{
"weather": "sun",
"temperature": 35.0,
},
},
{
Measurement: measurement,
Tags: map[string]string{
"location": "u2",
"country": "us",
},
Fields: map[string]interface{}{
"weather": "sun",
"temperature": 36.0,
},
},
}

for _, point := range points {
err := c.WritePoint(databaseName, point, callback)
assert.Nil(t, err)
}
time.Sleep(time.Second * 5)

// SHOW TAG VALUES FROM measurement WITH KEY = location order by location asc
tagValueResult, err := c.ShowTagValues(NewShowTagValuesBuilder().Database(databaseName).Measurement(measurement).
With("location").OrderBy("location", Asc))
assert.Nil(t, err)
assert.Equal(t, 4, len(tagValueResult))
expValues := []string{"c1", "c2", "u1", "u2"}
assert.EqualValues(t, expValues, tagValueResult)

// SHOW TAG VALUES FROM measurement WITH KEY = location order by location desc
tagValueResult, err = c.ShowTagValues(NewShowTagValuesBuilder().Database(databaseName).Measurement(measurement).
With("location").OrderBy("location", Desc))
assert.Nil(t, err)
assert.Equal(t, 4, len(tagValueResult))
expValues = []string{"u2", "u1", "c2", "c1"}
assert.EqualValues(t, expValues, tagValueResult)
}

func TestClient_ShowSeries(t *testing.T) {
c := testDefaultClient(t)
databaseName := randomDatabaseName()
Expand Down
12 changes: 12 additions & 0 deletions opengemini/measurement_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,8 @@ type ShowTagValuesBuilder interface {
Limit(limit int) ShowTagValuesBuilder
// Offset specify offset
Offset(offset int) ShowTagValuesBuilder
// OrderBy specify order by
OrderBy(field string, order SortOrder) ShowTagValuesBuilder
// With supports specifying a tag key, a regular expression or multiple tag keys, if set multiple keys, it will
// return all tag field values, if set keys length is one and such as /regex/ it will match the regex, otherwise it
// show one tag field values.
Expand All @@ -410,10 +412,16 @@ type showTagValuesBuilder struct {
measurementBase
limit int
offset int
orders []string
withKey []string
where *ComparisonCondition
}

func (s *showTagValuesBuilder) OrderBy(field string, order SortOrder) ShowTagValuesBuilder {
s.orders = append(s.orders, fmt.Sprintf("%s %s", field, order))
return s
}

func NewShowTagValuesBuilder() ShowTagValuesBuilder {
return &showTagValuesBuilder{}
}
Expand Down Expand Up @@ -484,6 +492,10 @@ func (s *showTagValuesBuilder) build() (string, error) {
buff.WriteString(" WHERE " + s.where.build())
}

if len(s.orders) != 0 {
buff.WriteString(" ORDER BY " + strings.Join(s.orders, ","))
}

if s.limit > 0 {
buff.WriteString(" LIMIT " + strconv.Itoa(s.limit))
}
Expand Down

0 comments on commit ed8804e

Please sign in to comment.