github.com/ravendb/ravendb-go-client@v0.0.0-20240229102137-4474ee7aa0fa/index_definition_builder.go (about) 1 package ravendb 2 3 type IndexDefinitionBuilder struct { 4 indexName string 5 6 smap string // Note: in Go map is a reserved keyword 7 reduce string 8 9 storesStrings map[string]FieldStorage 10 indexesStrings map[string]FieldIndexing 11 analyzersStrings map[string]string 12 suggestionsOptions []string 13 termVectorsStrings map[string]FieldTermVector 14 spatialIndexesStrings map[string]*SpatialOptions 15 lockMode IndexLockMode 16 priority IndexPriority 17 outputReduceToCollection string 18 additionalSources map[string]string 19 } 20 21 func NewIndexDefinitionBuilder(indexName string) *IndexDefinitionBuilder { 22 if indexName == "" { 23 indexName = "IndexDefinitionBuilder" 24 } 25 panicIf(len(indexName) > 256, "The index name is limited to 256 characters, but was: %s", indexName) 26 return &IndexDefinitionBuilder{ 27 indexName: indexName, 28 storesStrings: make(map[string]FieldStorage), 29 indexesStrings: make(map[string]FieldIndexing), 30 analyzersStrings: make(map[string]string), 31 termVectorsStrings: make(map[string]FieldTermVector), 32 spatialIndexesStrings: make(map[string]*SpatialOptions), 33 } 34 } 35 36 func (d *IndexDefinitionBuilder) toIndexDefinition(conventions *DocumentConventions, validateMap bool) *IndexDefinition { 37 if d.smap == "" && validateMap { 38 panicIf(true, "Map is required to generate an index, you cannot create an index without a valid Map property (in index "+d.indexName+").") 39 // TODO: return error IllegalStateError("Map is required to generate an index, you cannot create an index without a valid Map property (in index " + _indexName + ")."); 40 } 41 42 indexDefinition := NewIndexDefinition() 43 indexDefinition.Name = d.indexName 44 if d.reduce != "" { 45 indexDefinition.Reduce = &d.reduce 46 } 47 indexDefinition.LockMode = d.lockMode 48 indexDefinition.Priority = d.priority 49 indexDefinition.SetOutputReduceToCollection(d.outputReduceToCollection) 50 indexDefinition.updateIndexTypeAndMaps() 51 52 suggestions := make(map[string]bool) 53 for _, suggestionsOption := range d.suggestionsOptions { 54 suggestions[suggestionsOption] = true 55 } 56 57 // TODO: figure out a better way to do it. In Java applyValues() is templated function 58 { 59 f := func(options *IndexFieldOptions, value FieldIndexing) { 60 options.Indexing = value 61 } 62 d.applyFieldIndexingValues(indexDefinition, d.indexesStrings, f) 63 } 64 65 { 66 f := func(options *IndexFieldOptions, value FieldStorage) { 67 options.Storage = value 68 } 69 d.applyFieldStorageValues(indexDefinition, d.storesStrings, f) 70 } 71 72 { 73 f := func(options *IndexFieldOptions, value string) { 74 options.Analyzer = value 75 } 76 d.applyStringValues(indexDefinition, d.analyzersStrings, f) 77 } 78 79 { 80 f := func(options *IndexFieldOptions, value FieldTermVector) { 81 options.TermVector = value 82 } 83 d.applyFieldTermVectorValues(indexDefinition, d.termVectorsStrings, f) 84 } 85 86 { 87 f := func(options *IndexFieldOptions, value *SpatialOptions) { 88 options.Spatial = value 89 } 90 d.applySpatialOptionsValues(indexDefinition, d.spatialIndexesStrings, f) 91 } 92 93 { 94 f := func(options *IndexFieldOptions, value bool) { 95 options.Suggestions = value 96 } 97 d.applyBoolValues(indexDefinition, suggestions, f) 98 } 99 100 if d.smap != "" { 101 indexDefinition.Maps = append(indexDefinition.Maps, d.smap) 102 } 103 104 indexDefinition.SetAdditionalSources(d.additionalSources) 105 return indexDefinition 106 } 107 108 func (d *IndexDefinitionBuilder) applyFieldIndexingValues(indexDefinition *IndexDefinition, values map[string]FieldIndexing, action func(*IndexFieldOptions, FieldIndexing)) { 109 for key, value := range values { 110 fields := indexDefinition.GetFields() 111 field, ok := fields[key] 112 if !ok { 113 field = NewIndexFieldOptions() 114 fields[key] = field 115 } 116 action(field, value) 117 } 118 } 119 120 func (d *IndexDefinitionBuilder) applyFieldStorageValues(indexDefinition *IndexDefinition, values map[string]FieldStorage, action func(*IndexFieldOptions, FieldStorage)) { 121 for key, value := range values { 122 fields := indexDefinition.GetFields() 123 field, ok := fields[key] 124 if !ok { 125 field = NewIndexFieldOptions() 126 fields[key] = field 127 } 128 action(field, value) 129 } 130 } 131 132 func (d *IndexDefinitionBuilder) applyStringValues(indexDefinition *IndexDefinition, values map[string]string, action func(*IndexFieldOptions, string)) { 133 for key, value := range values { 134 fields := indexDefinition.GetFields() 135 field, ok := fields[key] 136 if !ok { 137 field = NewIndexFieldOptions() 138 fields[key] = field 139 } 140 action(field, value) 141 } 142 } 143 144 func (d *IndexDefinitionBuilder) applyFieldTermVectorValues(indexDefinition *IndexDefinition, values map[string]FieldTermVector, action func(*IndexFieldOptions, FieldTermVector)) { 145 for key, value := range values { 146 fields := indexDefinition.GetFields() 147 field, ok := fields[key] 148 if !ok { 149 field = NewIndexFieldOptions() 150 fields[key] = field 151 } 152 action(field, value) 153 } 154 } 155 156 func (d *IndexDefinitionBuilder) applySpatialOptionsValues(indexDefinition *IndexDefinition, values map[string]*SpatialOptions, action func(*IndexFieldOptions, *SpatialOptions)) { 157 for key, value := range values { 158 fields := indexDefinition.GetFields() 159 field, ok := fields[key] 160 if !ok { 161 field = NewIndexFieldOptions() 162 fields[key] = field 163 } 164 action(field, value) 165 } 166 } 167 168 func (d *IndexDefinitionBuilder) applyBoolValues(indexDefinition *IndexDefinition, values map[string]bool, action func(*IndexFieldOptions, bool)) { 169 for key, value := range values { 170 fields := indexDefinition.GetFields() 171 field, ok := fields[key] 172 if !ok { 173 field = NewIndexFieldOptions() 174 fields[key] = field 175 } 176 action(field, value) 177 } 178 } 179 180 func (d *IndexDefinitionBuilder) getMap() string { 181 return d.smap 182 } 183 184 func (d *IndexDefinitionBuilder) setMap(smap string) { 185 d.smap = smap 186 }