sort_test.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. // Copyright 2012-2015 Oliver Eilhard. All rights reserved.
  2. // Use of this source code is governed by a MIT-license.
  3. // See http://olivere.mit-license.org/license.txt for details.
  4. package elastic
  5. import (
  6. "encoding/json"
  7. "testing"
  8. )
  9. func TestSortInfo(t *testing.T) {
  10. builder := SortInfo{Field: "grade", Ascending: false}
  11. data, err := json.Marshal(builder.Source())
  12. if err != nil {
  13. t.Fatalf("marshaling to JSON failed: %v", err)
  14. }
  15. got := string(data)
  16. expected := `{"grade":{"order":"desc"}}`
  17. if got != expected {
  18. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  19. }
  20. }
  21. func TestScoreSort(t *testing.T) {
  22. builder := NewScoreSort()
  23. if builder.ascending != false {
  24. t.Error("expected score sorter to be ascending by default")
  25. }
  26. data, err := json.Marshal(builder.Source())
  27. if err != nil {
  28. t.Fatalf("marshaling to JSON failed: %v", err)
  29. }
  30. got := string(data)
  31. expected := `{"_score":{}}`
  32. if got != expected {
  33. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  34. }
  35. }
  36. func TestScoreSortOrderAscending(t *testing.T) {
  37. builder := NewScoreSort().Asc()
  38. data, err := json.Marshal(builder.Source())
  39. if err != nil {
  40. t.Fatalf("marshaling to JSON failed: %v", err)
  41. }
  42. got := string(data)
  43. expected := `{"_score":{"reverse":true}}`
  44. if got != expected {
  45. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  46. }
  47. }
  48. func TestScoreSortOrderDescending(t *testing.T) {
  49. builder := NewScoreSort().Desc()
  50. data, err := json.Marshal(builder.Source())
  51. if err != nil {
  52. t.Fatalf("marshaling to JSON failed: %v", err)
  53. }
  54. got := string(data)
  55. expected := `{"_score":{}}`
  56. if got != expected {
  57. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  58. }
  59. }
  60. func TestFieldSort(t *testing.T) {
  61. builder := NewFieldSort("grade")
  62. data, err := json.Marshal(builder.Source())
  63. if err != nil {
  64. t.Fatalf("marshaling to JSON failed: %v", err)
  65. }
  66. got := string(data)
  67. expected := `{"grade":{"order":"asc"}}`
  68. if got != expected {
  69. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  70. }
  71. }
  72. func TestFieldSortOrderDesc(t *testing.T) {
  73. builder := NewFieldSort("grade").Desc()
  74. data, err := json.Marshal(builder.Source())
  75. if err != nil {
  76. t.Fatalf("marshaling to JSON failed: %v", err)
  77. }
  78. got := string(data)
  79. expected := `{"grade":{"order":"desc"}}`
  80. if got != expected {
  81. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  82. }
  83. }
  84. func TestFieldSortComplex(t *testing.T) {
  85. builder := NewFieldSort("price").Desc().
  86. SortMode("avg").
  87. Missing("_last").
  88. UnmappedType("product").
  89. NestedFilter(NewTermFilter("product.color", "blue")).
  90. NestedPath("variant")
  91. data, err := json.Marshal(builder.Source())
  92. if err != nil {
  93. t.Fatalf("marshaling to JSON failed: %v", err)
  94. }
  95. got := string(data)
  96. expected := `{"price":{"missing":"_last","mode":"avg","nested_filter":{"term":{"product.color":"blue"}},"nested_path":"variant","order":"desc","unmapped_type":"product"}}`
  97. if got != expected {
  98. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  99. }
  100. }
  101. func TestGeoDistanceSort(t *testing.T) {
  102. builder := NewGeoDistanceSort("pin.location").
  103. Point(-70, 40).
  104. Order(true).
  105. Unit("km").
  106. SortMode("min").
  107. GeoDistance("sloppy_arc")
  108. data, err := json.Marshal(builder.Source())
  109. if err != nil {
  110. t.Fatalf("marshaling to JSON failed: %v", err)
  111. }
  112. got := string(data)
  113. expected := `{"_geo_distance":{"distance_type":"sloppy_arc","mode":"min","pin.location":[{"lat":-70,"lon":40}],"unit":"km"}}`
  114. if got != expected {
  115. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  116. }
  117. }
  118. func TestGeoDistanceSortOrderDesc(t *testing.T) {
  119. builder := NewGeoDistanceSort("pin.location").
  120. Point(-70, 40).
  121. Unit("km").
  122. SortMode("min").
  123. GeoDistance("sloppy_arc").
  124. Desc()
  125. data, err := json.Marshal(builder.Source())
  126. if err != nil {
  127. t.Fatalf("marshaling to JSON failed: %v", err)
  128. }
  129. got := string(data)
  130. expected := `{"_geo_distance":{"distance_type":"sloppy_arc","mode":"min","pin.location":[{"lat":-70,"lon":40}],"reverse":true,"unit":"km"}}`
  131. if got != expected {
  132. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  133. }
  134. }
  135. func TestScriptSort(t *testing.T) {
  136. builder := NewScriptSort("doc['field_name'].value * factor", "number").
  137. Param("factor", 1.1).
  138. Order(true)
  139. data, err := json.Marshal(builder.Source())
  140. if err != nil {
  141. t.Fatalf("marshaling to JSON failed: %v", err)
  142. }
  143. got := string(data)
  144. expected := `{"_script":{"params":{"factor":1.1},"script":"doc['field_name'].value * factor","type":"number"}}`
  145. if got != expected {
  146. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  147. }
  148. }
  149. func TestScriptSortOrderDesc(t *testing.T) {
  150. builder := NewScriptSort("doc['field_name'].value * factor", "number").
  151. Param("factor", 1.1).
  152. Desc()
  153. data, err := json.Marshal(builder.Source())
  154. if err != nil {
  155. t.Fatalf("marshaling to JSON failed: %v", err)
  156. }
  157. got := string(data)
  158. expected := `{"_script":{"params":{"factor":1.1},"reverse":true,"script":"doc['field_name'].value * factor","type":"number"}}`
  159. if got != expected {
  160. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  161. }
  162. }