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

     1  package ravendb
     2  
     3  import "strings"
     4  
     5  var _ queryToken = &orderByToken{}
     6  
     7  var (
     8  	orderByTokenRandom          = newOrderByToken("random()", false, OrderingTypeString)
     9  	orderByTokenScoreAscending  = newOrderByToken("score()", false, OrderingTypeString)
    10  	orderByTokenScoreDescending = newOrderByToken("score()", true, OrderingTypeString)
    11  )
    12  
    13  type orderByToken struct {
    14  	fieldName  string
    15  	descending bool
    16  	ordering   OrderingType
    17  }
    18  
    19  func newOrderByToken(fieldName string, descending bool, ordering OrderingType) *orderByToken {
    20  	return &orderByToken{
    21  		fieldName:  fieldName,
    22  		descending: descending,
    23  		ordering:   ordering,
    24  	}
    25  }
    26  
    27  func orderByTokenCreateDistanceAscending(fieldName string, latitudeParameterName string, longitudeParameterName string) *orderByToken {
    28  	return newOrderByToken("spatial.distance("+fieldName+", spatial.point($"+latitudeParameterName+", $"+longitudeParameterName+"))", false, OrderingTypeString)
    29  }
    30  
    31  func orderByTokenCreateDistanceAscending2(fieldName string, shapeWktParameterName string) *orderByToken {
    32  	return newOrderByToken("spatial.distance("+fieldName+", spatial.wkt($"+shapeWktParameterName+"))", false, OrderingTypeString)
    33  }
    34  
    35  func orderByTokenCreateDistanceDescending(fieldName string, latitudeParameterName string, longitudeParameterName string) *orderByToken {
    36  	return newOrderByToken("spatial.distance("+fieldName+", spatial.point($"+latitudeParameterName+", $"+longitudeParameterName+"))", true, OrderingTypeString)
    37  }
    38  
    39  func orderByTokenCreateDistanceDescending2(fieldName string, shapeWktParameterName string) *orderByToken {
    40  	return newOrderByToken("spatial.distance("+fieldName+", spatial.wkt($"+shapeWktParameterName+"))", true, OrderingTypeString)
    41  }
    42  
    43  func orderByTokenCreateRandom(seed string) *orderByToken {
    44  	if seed == "" {
    45  		panicIf(true, "seed cannot be null")
    46  		// newIllegalArgumentError("seed cannot be null");
    47  	}
    48  	seed = strings.Replace(seed, "'", "''", -1)
    49  	return newOrderByToken("random('"+seed+"')", false, OrderingTypeString)
    50  }
    51  
    52  func orderByTokenCreateAscending(fieldName string, ordering OrderingType) *orderByToken {
    53  	return newOrderByToken(fieldName, false, ordering)
    54  }
    55  
    56  func orderByTokenCreateDescending(fieldName string, ordering OrderingType) *orderByToken {
    57  	return newOrderByToken(fieldName, true, ordering)
    58  }
    59  
    60  func (t *orderByToken) writeTo(writer *strings.Builder) error {
    61  	writeQueryTokenField(writer, t.fieldName)
    62  
    63  	switch t.ordering {
    64  	case OrderingTypeLong:
    65  		writer.WriteString(" as long")
    66  	case OrderingTypeDouble:
    67  		writer.WriteString(" as double")
    68  	case OrderingTypeAlphaNumeric:
    69  		writer.WriteString(" as alphaNumeric")
    70  	}
    71  
    72  	if t.descending { // we only add this if we have to, ASC is the default and reads nicer
    73  		writer.WriteString(" desc")
    74  	}
    75  	return nil
    76  }