github.com/altipla-consulting/ravendb-go-client@v0.1.3/facet_token.go (about)

     1  package ravendb
     2  
     3  import "strings"
     4  
     5  var _ queryToken = &facetToken{}
     6  
     7  type facetToken struct {
     8  	facetSetupDocumentID string
     9  	aggregateByFieldName string
    10  	alias                string
    11  	ranges               []string
    12  	optionsParameterName string
    13  
    14  	aggregations []*facetAggregationToken
    15  }
    16  
    17  func (t *facetToken) GetName() string {
    18  	return firstNonEmptyString(t.alias, t.aggregateByFieldName)
    19  }
    20  
    21  func newFacetTokenWithID(facetSetupDocumentID string) *facetToken {
    22  	return &facetToken{
    23  		facetSetupDocumentID: facetSetupDocumentID,
    24  	}
    25  }
    26  
    27  func newFacetTokenAll(aggregateByFieldName string, alias string, ranges []string, optionsParameterName string) *facetToken {
    28  	return &facetToken{
    29  		aggregateByFieldName: aggregateByFieldName,
    30  		alias:                alias,
    31  		ranges:               ranges,
    32  		optionsParameterName: optionsParameterName,
    33  	}
    34  }
    35  
    36  func (t *facetToken) writeTo(writer *strings.Builder) error {
    37  	writer.WriteString("facet(")
    38  
    39  	if t.facetSetupDocumentID != "" {
    40  		writer.WriteString("id('")
    41  		writer.WriteString(t.facetSetupDocumentID)
    42  		writer.WriteString("'))")
    43  
    44  		return nil
    45  	}
    46  
    47  	firstArgument := false
    48  
    49  	if t.aggregateByFieldName != "" {
    50  		writer.WriteString(t.aggregateByFieldName)
    51  	} else if len(t.ranges) != 0 {
    52  		firstInRange := true
    53  
    54  		for _, rang := range t.ranges {
    55  			if !firstInRange {
    56  				writer.WriteString(", ")
    57  			}
    58  
    59  			firstInRange = false
    60  			writer.WriteString(rang)
    61  		}
    62  	} else {
    63  		firstArgument = true
    64  	}
    65  
    66  	for _, aggregation := range t.aggregations {
    67  		if !firstArgument {
    68  			writer.WriteString(", ")
    69  		}
    70  		firstArgument = false
    71  		if err := aggregation.writeTo(writer); err != nil {
    72  			return err
    73  		}
    74  	}
    75  
    76  	if stringIsNotBlank(t.optionsParameterName) {
    77  		writer.WriteString(", $")
    78  		writer.WriteString(t.optionsParameterName)
    79  	}
    80  
    81  	writer.WriteString(")")
    82  
    83  	if stringIsBlank(t.alias) || t.alias == t.aggregateByFieldName {
    84  		return nil
    85  	}
    86  
    87  	writer.WriteString(" as ")
    88  	writer.WriteString(t.alias)
    89  
    90  	return nil
    91  }
    92  
    93  func createFacetToken(facetSetupDocumentID string) (*facetToken, error) {
    94  	if stringIsBlank(facetSetupDocumentID) {
    95  		return nil, newIllegalArgumentError("facetSetupDocumentID cannot be null")
    96  	}
    97  
    98  	return newFacetTokenWithID(facetSetupDocumentID), nil
    99  }
   100  
   101  func createFacetTokenWithFacet(facet *Facet, addQueryParameter func(interface{}) string) *facetToken {
   102  	optionsParameterName := getOptionsParameterName(facet, addQueryParameter)
   103  	token := newFacetTokenAll(facet.FieldName, facet.DisplayFieldName, nil, optionsParameterName)
   104  
   105  	applyAggregations(facet, token)
   106  	return token
   107  }
   108  
   109  func createFacetTokenWithRangeFacet(facet *RangeFacet, addQueryParameter func(interface{}) string) (*facetToken, error) {
   110  	optionsParameterName := getOptionsParameterName(facet, addQueryParameter)
   111  
   112  	token := newFacetTokenAll("", facet.DisplayFieldName, facet.Ranges, optionsParameterName)
   113  
   114  	applyAggregations(facet, token)
   115  
   116  	return token, nil
   117  }
   118  
   119  func createFacetTokenWithGenericRangeFacet(facet *GenericRangeFacet, addQueryParameter func(interface{}) string) (*facetToken, error) {
   120  	optionsParameterName := getOptionsParameterName(facet, addQueryParameter)
   121  
   122  	var ranges []string
   123  	for _, rangeBuilder := range facet.Ranges {
   124  		r, err := genericRangeFacetParse(rangeBuilder, addQueryParameter)
   125  		if err != nil {
   126  			return nil, err
   127  		}
   128  		ranges = append(ranges, r)
   129  	}
   130  
   131  	token := newFacetTokenAll("", facet.DisplayFieldName, ranges, optionsParameterName)
   132  
   133  	applyAggregations(facet, token)
   134  	return token, nil
   135  }
   136  
   137  func createFacetTokenWithFacetBase(facet FacetBase, addQueryParameter func(interface{}) string) (*facetToken, error) {
   138  	// this is just a dispatcher
   139  	return facet.ToFacetToken(addQueryParameter)
   140  }
   141  
   142  func applyAggregations(facet FacetBase, token *facetToken) {
   143  	m := facet.GetAggregations()
   144  
   145  	for key, value := range m {
   146  		var aggregationToken *facetAggregationToken
   147  		switch key {
   148  		case FacetAggregationMax:
   149  			aggregationToken = facetAggregationTokenMax(value)
   150  		case FacetAggregationMin:
   151  			aggregationToken = facetAggregationTokenMin(value)
   152  		case FacetAggregationAverage:
   153  			aggregationToken = facetAggregationTokenAverage(value)
   154  		case FacetAggregationSum:
   155  			aggregationToken = facetAggregationTokenSum(value)
   156  		default:
   157  			panic("Unsupported aggregation method: " + key)
   158  			//throw new NotImplementedError("Unsupported aggregation method: " + aggregation.getKey());
   159  		}
   160  
   161  		token.aggregations = append(token.aggregations, aggregationToken)
   162  	}
   163  }
   164  
   165  func getOptionsParameterName(facet FacetBase, addQueryParameter func(interface{}) string) string {
   166  	if facet.GetOptions() == nil || facet.GetOptions() == DefaultFacetOptions {
   167  		return ""
   168  	}
   169  	return addQueryParameter(facet.GetOptions())
   170  }
   171  
   172  var _ queryToken = &facetAggregationToken{}
   173  
   174  type facetAggregationToken struct {
   175  	fieldName   string
   176  	aggregation FacetAggregation
   177  }
   178  
   179  func newFacetAggregationToken(fieldName string, aggregation FacetAggregation) *facetAggregationToken {
   180  	return &facetAggregationToken{
   181  		fieldName:   fieldName,
   182  		aggregation: aggregation,
   183  	}
   184  }
   185  
   186  func (t *facetAggregationToken) writeTo(writer *strings.Builder) error {
   187  	switch t.aggregation {
   188  	case FacetAggregationMax:
   189  		writer.WriteString("max(")
   190  		writer.WriteString(t.fieldName)
   191  		writer.WriteString(")")
   192  	case FacetAggregationMin:
   193  		writer.WriteString("min(")
   194  		writer.WriteString(t.fieldName)
   195  		writer.WriteString(")")
   196  	case FacetAggregationAverage:
   197  		writer.WriteString("avg(")
   198  		writer.WriteString(t.fieldName)
   199  		writer.WriteString(")")
   200  	case FacetAggregationSum:
   201  		writer.WriteString("sum(")
   202  		writer.WriteString(t.fieldName)
   203  		writer.WriteString(")")
   204  	default:
   205  		return newIllegalArgumentError("Invalid aggregation mode: " + t.aggregation)
   206  	}
   207  	return nil
   208  }
   209  
   210  func facetAggregationTokenMax(fieldName string) *facetAggregationToken {
   211  	panicIf(stringIsBlank(fieldName), "FieldName can not be null")
   212  	return newFacetAggregationToken(fieldName, FacetAggregationMax)
   213  }
   214  
   215  func facetAggregationTokenMin(fieldName string) *facetAggregationToken {
   216  	panicIf(stringIsBlank(fieldName), "FieldName can not be null")
   217  	return newFacetAggregationToken(fieldName, FacetAggregationMin)
   218  }
   219  
   220  func facetAggregationTokenAverage(fieldName string) *facetAggregationToken {
   221  	panicIf(stringIsBlank(fieldName), "FieldName can not be null")
   222  	return newFacetAggregationToken(fieldName, FacetAggregationAverage)
   223  }
   224  
   225  func facetAggregationTokenSum(fieldName string) *facetAggregationToken {
   226  	panicIf(stringIsBlank(fieldName), "FieldName can not be null")
   227  	return newFacetAggregationToken(fieldName, FacetAggregationSum)
   228  }