github.com/altipla-consulting/ravendb-go-client@v0.1.3/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  }