facet method

  1. @Assert('isGreaterThanOrEqualTo == null || (isGreaterThanOrEqualTo != null && (isGreaterThanOrEqualTo is double || isGreaterThanOrEqualTo is DateTime))', '`isMoreThanOrEqualTo` must be a double or a DateTime')
  2. @Assert('isLessThan == null || (isLessThan != null && (isLessThan is double || isLessThan is DateTime))', '`isLessThan` must be a double or a DateTime')
  3. @Assert('(isEqualTo != null && isFurtherThanOrAt == null && isLessFarThan == null) || (isEqualTo == null && (isFurtherThanOrAt != null || isLessFarThan != null)) || (isEqualTo == null && isFurtherThanOrAt == null && isLessFarThan == null)', 'You cannot use isEqualTo and isFurtherThanOrAt/isLessFarThan at the same time.')
  4. @Assert('((isFurtherThanOrAt != null || isLessFarThan != null) && isGreaterThanOrEqualTo == null && isLessThan == null) || ((isGreaterThanOrEqualTo != null || isLessThan != null) && isFurtherThanOrAt == null && isLessFarThan == null) || (isGreaterThanOrEqualTo == null && isLessThan == null && isFurtherThanOrAt == null && isLessFarThan == null)', 'You cannot use isFurtherThanOrAt/isLessFarThan and isGreaterThanOrEqualTo/isLessThan at the same time.')
  5. @Assert('((isFurtherThanOrAt != null || isLessFarThan != null) && from == null) || (isFurtherThanOrAt == null && isLessFarThan == null && from == null)', 'You must provide from (which is the center point of your query) when using isFurtherThanOrAt/isLessFarThan.')
ElasticQuery facet(
  1. String field, {
  2. String? name,
  3. Object? isGreaterThanOrEqualTo,
  4. Object? isLessThan,
  5. Object? isFurtherThanOrAt,
  6. Object? isLessFarThan,
  7. LatLong? from,
  8. @Default(GeoUnit.meters) GeoUnit? unit,
  9. int? size,
})

Creates and returns a new ElasticQuery with additional ElasticFacet, an object which rovides the counts of each value for a field, or counts of documents within the provided ranges if isMoreThanOrEqualTo or isLessThan is provided.

See https://www.elastic.co/guide/en/app-search/current/facets.html

Implementation

@Assert(
    'isGreaterThanOrEqualTo == null || (isGreaterThanOrEqualTo != null && (isGreaterThanOrEqualTo is double || isGreaterThanOrEqualTo is DateTime))',
    '`isMoreThanOrEqualTo` must be a double or a DateTime')
@Assert(
    'isLessThan == null || (isLessThan != null && (isLessThan is double || isLessThan is DateTime))',
    '`isLessThan` must be a double or a DateTime')
@Assert(
    '(isEqualTo != null && isFurtherThanOrAt == null && isLessFarThan == null) || (isEqualTo == null && (isFurtherThanOrAt != null || isLessFarThan != null)) || (isEqualTo == null && isFurtherThanOrAt == null && isLessFarThan == null)',
    'You cannot use isEqualTo and isFurtherThanOrAt/isLessFarThan at the same time.')
@Assert(
    '((isFurtherThanOrAt != null || isLessFarThan != null) && isGreaterThanOrEqualTo == null && isLessThan == null) || ((isGreaterThanOrEqualTo != null || isLessThan != null) && isFurtherThanOrAt == null && isLessFarThan == null) || (isGreaterThanOrEqualTo == null && isLessThan == null && isFurtherThanOrAt == null && isLessFarThan == null)',
    'You cannot use isFurtherThanOrAt/isLessFarThan and isGreaterThanOrEqualTo/isLessThan at the same time.')
@Assert(
    '((isFurtherThanOrAt != null || isLessFarThan != null) && from == null) || (isFurtherThanOrAt == null && isLessFarThan == null && from == null)',
    'You must provide from (which is the center point of your query) when using isFurtherThanOrAt/isLessFarThan.')
ElasticQuery facet(
  String field, {
  String? name,
  Object? isGreaterThanOrEqualTo,
  Object? isLessThan,
  Object? isFurtherThanOrAt,
  Object? isLessFarThan,
  LatLong? from,
  @Default(GeoUnit.meters) GeoUnit? unit,
  int? size,
  //List<ElasticRange>? ranges,
}) {
  Map<String, _ElasticQueryFacet> _facets =
      facets != null ? {...facets!} : {};
  _ElasticQueryFacet facet;

  /*if (ranges != null) {
    facet = _ElasticQueryFacet(
      type: "range",
      ranges: ranges
          .map(
            (range) => _ElasticRangeFacet(
              name: range.name,
              from: range.from is DateTime
                  ? (range.from as DateTime).toUTCString()
                  : range.from?.toString(),
              to: range.to is DateTime
                  ? (range.to as DateTime).toUTCString()
                  : range.to?.toString(),
            ),
          )
          .toList(),
      center: center,
      unit: unit,
    );
  }*/
  if (from != null) {
    final newRange = _ElasticRangeFacet(
      name: name,
      from: isFurtherThanOrAt?.toString(),
      to: isLessFarThan?.toString(),
    );
    facet = _ElasticQueryFacet(
      type: "range",
      ranges: [
        ...?facets?[field]?.ranges,
        newRange,
      ],
      center: from,
      unit: unit,
    );
  } else if (isGreaterThanOrEqualTo != null || isLessThan != null) {
    final newRange = _ElasticRangeFacet(
      name: name,
      from: isGreaterThanOrEqualTo is DateTime
          ? isGreaterThanOrEqualTo.toUTCString()
          : isGreaterThanOrEqualTo?.toString(),
      to: isLessThan is DateTime
          ? isLessThan.toUTCString()
          : isLessThan?.toString(),
    );
    facet = _ElasticQueryFacet(
      type: "range",
      ranges: [
        ...?facets?[field]?.ranges,
        newRange,
      ],
    );
  } else {
    facet = _ElasticQueryFacet(
      type: "value",
      size: size,
    );
  }

  _facets[field] = facet;
  return copyWith(facets: _facets);
}