github.com/altipla-consulting/ravendb-go-client@v0.1.3/tests/facet_paging_test.go (about) 1 package tests 2 3 import ( 4 "sort" 5 "strings" 6 "testing" 7 8 ravendb "github.com/altipla-consulting/ravendb-go-client" 9 "github.com/stretchr/testify/assert" 10 ) 11 12 const ( 13 numCameras = 1000 14 ) 15 16 var ( 17 _data []*Camera 18 ) 19 20 func facetPaging_canPerformFacetedPagingSearchWithNoPageSizeNoMaxResults_HitsDesc(t *testing.T, driver *RavenTestDriver) { 21 facetOptions := ravendb.NewFacetOptions() 22 facetOptions.Start = 2 23 facetOptions.TermSortMode = ravendb.FacetTermSortModeCountDesc 24 facetOptions.IncludeRemainingTerms = true 25 26 facet := ravendb.NewFacet() 27 facet.FieldName = "manufacturer" 28 facet.Options = facetOptions 29 30 facets := []*ravendb.Facet{facet} 31 32 var err error 33 store := driver.getDocumentStoreMust(t) 34 defer store.Close() 35 36 facetPaging_setup(t, store) 37 { 38 session := openSessionMust(t, store) 39 40 facetSetup := &ravendb.FacetSetup{} 41 facetSetup.ID = "facets/CameraFacets" 42 facetSetup.Facets = facets 43 44 err = session.Store(facetSetup) 45 assert.NoError(t, err) 46 err = session.SaveChanges() 47 assert.NoError(t, err) 48 49 q := session.QueryIndex("CameraCost") 50 ag := q.AggregateUsing("facets/CameraFacets") 51 facetResults, err := ag.Execute() 52 assert.NoError(t, err) 53 54 cameraCounts := map[string]int{} 55 for _, camera := range _data { 56 cameraCounts[camera.Manufacturer]++ 57 } 58 59 var camerasByHits []string 60 for c := range cameraCounts { 61 camerasByHits = append(camerasByHits, c) 62 } 63 sort.Slice(camerasByHits, func(i, j int) bool { 64 namei := camerasByHits[i] 65 namej := camerasByHits[j] 66 ci := cameraCounts[namei] 67 cj := cameraCounts[namej] 68 if ci != cj { 69 return cj < ci // reverse order 70 } 71 return namej > namei 72 }) 73 camerasByHits = camerasByHits[2:] 74 for i, s := range camerasByHits { 75 camerasByHits[i] = strings.ToLower(s) 76 } 77 78 vals := facetResults["manufacturer"].Values 79 assert.Equal(t, len(vals), 3) 80 81 assert.Equal(t, vals[0].Range, camerasByHits[0]) 82 assert.Equal(t, vals[1].Range, camerasByHits[1]) 83 assert.Equal(t, vals[2].Range, camerasByHits[2]) 84 85 for _, f := range vals { 86 fM := strings.ToLower(f.Range) 87 inMemoryCount := 0 88 for _, camera := range _data { 89 camM := strings.ToLower(camera.Manufacturer) 90 if camM == fM { 91 inMemoryCount++ 92 } 93 } 94 assert.Equal(t, f.Count, inMemoryCount) 95 } 96 97 fr := facetResults["manufacturer"] 98 assert.Equal(t, fr.RemainingTermsCount, 0) 99 assert.Equal(t, len(fr.RemainingTerms), 0) 100 assert.Equal(t, fr.RemainingHits, 0) 101 102 session.Close() 103 } 104 } 105 106 func facetPaging_canPerformFacetedPagingSearchWithNoPageSizeWithMaxResults_HitsDesc(t *testing.T, driver *RavenTestDriver) { 107 facetOptions := ravendb.NewFacetOptions() 108 facetOptions.Start = 2 109 facetOptions.PageSize = 2 110 facetOptions.TermSortMode = ravendb.FacetTermSortModeCountDesc 111 facetOptions.IncludeRemainingTerms = true 112 113 facet := ravendb.NewFacet() 114 facet.FieldName = "manufacturer" 115 facet.Options = facetOptions 116 117 facets := []*ravendb.Facet{facet} 118 119 var err error 120 store := driver.getDocumentStoreMust(t) 121 defer store.Close() 122 123 facetPaging_setup(t, store) 124 { 125 session := openSessionMust(t, store) 126 127 facetSetup := &ravendb.FacetSetup{} 128 facetSetup.ID = "facets/CameraFacets" 129 facetSetup.Facets = facets 130 131 err = session.Store(facetSetup) 132 assert.NoError(t, err) 133 err = session.SaveChanges() 134 assert.NoError(t, err) 135 136 q := session.QueryIndex("CameraCost") 137 ag := q.AggregateUsing("facets/CameraFacets") 138 facetResults, err := ag.Execute() 139 assert.NoError(t, err) 140 141 cameraCounts := map[string]int{} 142 for _, camera := range _data { 143 cameraCounts[camera.Manufacturer]++ 144 } 145 146 var camerasByHits []string 147 for c := range cameraCounts { 148 camerasByHits = append(camerasByHits, c) 149 } 150 sort.Slice(camerasByHits, func(i, j int) bool { 151 namei := camerasByHits[i] 152 namej := camerasByHits[j] 153 ci := cameraCounts[namei] 154 cj := cameraCounts[namej] 155 if ci != cj { 156 return cj < ci // reverse order 157 } 158 return namej > namei 159 }) 160 camerasByHits = camerasByHits[2:] 161 if len(camerasByHits) > 2 { 162 camerasByHits = camerasByHits[:2] 163 } 164 165 for i, s := range camerasByHits { 166 camerasByHits[i] = strings.ToLower(s) 167 } 168 169 vals := facetResults["manufacturer"].Values 170 assert.Equal(t, len(vals), 2) 171 172 assert.Equal(t, vals[0].Range, camerasByHits[0]) 173 assert.Equal(t, vals[1].Range, camerasByHits[1]) 174 175 for _, f := range vals { 176 fM := strings.ToLower(f.Range) 177 inMemoryCount := 0 178 for _, camera := range _data { 179 camM := strings.ToLower(camera.Manufacturer) 180 if camM == fM { 181 inMemoryCount++ 182 } 183 } 184 assert.Equal(t, f.Count, inMemoryCount) 185 186 } 187 188 // Note: Java does it inside the above loop, for no reason 189 fr := facetResults["manufacturer"] 190 assert.Equal(t, fr.RemainingTermsCount, 1) 191 assert.Equal(t, len(fr.RemainingTerms), 1) 192 193 var counts []int 194 for _, count := range cameraCounts { 195 counts = append(counts, count) 196 } 197 sort.Ints(counts) 198 assert.Equal(t, counts[0], fr.RemainingHits) 199 200 session.Close() 201 } 202 } 203 204 func facetPaging_setup(t *testing.T, store *ravendb.DocumentStore) { 205 206 s, err := store.OpenSession("") 207 assert.NoError(t, err) 208 defer s.Close() 209 210 indexDefinition := &ravendb.IndexDefinition{} 211 indexDefinition.Name = "CameraCost" 212 indexDefinition.Maps = []string{ 213 "from camera in docs select new { camera.manufacturer, camera.model, camera.cost, camera.dateOfListing, camera.megapixels } ", 214 } 215 216 op := ravendb.NewPutIndexesOperation(indexDefinition) 217 err = store.Maintenance().Send(op) 218 assert.NoError(t, err) 219 220 counter := 0 221 for _, camera := range _data { 222 err = s.Store(camera) 223 assert.NoError(t, err) 224 counter++ 225 226 if counter%(numCameras/25) == 0 { 227 err = s.SaveChanges() 228 assert.NoError(t, err) 229 } 230 } 231 232 err = s.SaveChanges() 233 assert.NoError(t, err) 234 235 err = waitForIndexing(store, "", 0) 236 assert.NoError(t, err) 237 } 238 239 func TestFacetPaging(t *testing.T) { 240 _data = facetTestBaseGetCameras(numCameras) 241 242 driver := createTestDriver(t) 243 destroy := func() { destroyDriver(t, driver) } 244 defer recoverTest(t, destroy) 245 246 // matches order of Java tests 247 facetPaging_canPerformFacetedPagingSearchWithNoPageSizeNoMaxResults_HitsDesc(t, driver) 248 facetPaging_canPerformFacetedPagingSearchWithNoPageSizeWithMaxResults_HitsDesc(t, driver) 249 }