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  }