Browse Source

Revert "feat(search): Share tests between frontend + backend" (#26706)

* Revert "feat(search): Share tests between frontend + backend (#26701)"

This reverts commit a7ef784cb7656822086a7710230872d0f12dac12.

* Revert "feat(search): A few more validation checks (#26698)"

This reverts commit d8d11d403a6b0ea83a7a3867aec3e116f769411f.
Tony Xiao 3 years ago
parent
commit
9b71ea0e59

+ 3 - 29
static/app/components/searchSyntax/parser.tsx

@@ -234,8 +234,6 @@ type FilterMap = {
   };
 };
 
-type TextFilter = FilterMap[FilterType.Text];
-
 /**
  * The Filter type discriminates on the FilterType enum using the `filter` key.
  *
@@ -329,7 +327,7 @@ class TokenConverter {
       key,
       operator: operator ?? TermOperator.Default,
       value,
-      invalidReason: this.checkInvalidFilter(type, key, value),
+      invalidReason: type === FilterType.Text ? this.checkInvalidTextFilter(key) : null,
     } as FilterResult);
 
   tokenFreeText = (value: string, quoted: boolean) =>
@@ -520,25 +518,13 @@ class TokenConverter {
   /**
    * Predicates weather a text filter have operators for specific keys.
    */
-  predicateTextOperator = (key: TextFilter['key']) =>
+  predicateTextOperator = (key: FilterMap[FilterType.Text]['key']) =>
     this.config.textOperatorKeys.has(getKeyName(key));
 
-  checkInvalidFilter = <T extends FilterType>(
-    type: T,
-    key: FilterMap[T]['key'],
-    value: FilterMap[T]['value']
-  ) =>
-    type !== FilterType.Text
-      ? null
-      : this.checkInvalidTextFilter(
-          key as TextFilter['key'],
-          value as TextFilter['value']
-        );
-
   /**
    * Validates that a text filter is not using a non-text key.
    */
-  checkInvalidTextFilter = (key: TextFilter['key'], value: TextFilter['value']) => {
+  checkInvalidTextFilter = (key: FilterMap[FilterType]['key']) => {
     // Explicit tag keys are always treated as text filters
     if (key.type === Token.KeyExplicitTag) {
       return null;
@@ -546,10 +532,6 @@ class TokenConverter {
 
     const keyName = getKeyName(key);
 
-    if (this.keyValidation.isDuration(keyName)) {
-      return t('Invalid duration. Expected number followed by duration unit suffix.');
-    }
-
     if (this.keyValidation.isDate(keyName)) {
       return t(
         'Invalid date format. Expected +/-duration (e.g. +1h) or ISO 8601-like (e.g. {now}).',
@@ -567,14 +549,6 @@ class TokenConverter {
       );
     }
 
-    if (!value.quoted && /(?<!\\)"/.test(value.value)) {
-      return t('Quotes must enclose text or be escaped.');
-    }
-
-    if (!value.quoted && value.value === '') {
-      return t('Filter must have a value');
-    }
-
     return null;
   };
 }

+ 0 - 56
static/app/components/searchSyntax/utils.tsx

@@ -1,56 +0,0 @@
-import {Token, TokenResult} from './parser';
-
-/**
- * Utility function to visit every Token node within an AST tree and apply
- * a transform to those nodes.
- */
-export function treeTransformer(
-  tree: TokenResult<Token>[],
-  transform: (token: TokenResult<Token>) => any
-) {
-  const nodeVisitor = (token: TokenResult<Token>) => {
-    switch (token.type) {
-      case Token.Filter:
-        return transform({
-          ...token,
-          key: nodeVisitor(token.key),
-          value: nodeVisitor(token.value),
-        });
-      case Token.KeyExplicitTag:
-        return transform({
-          ...token,
-          key: nodeVisitor(token.key),
-        });
-      case Token.KeyAggregate:
-        return transform({
-          ...token,
-          name: nodeVisitor(token.name),
-          args: token.args ? nodeVisitor(token.args) : token.args,
-          argsSpaceBefore: nodeVisitor(token.argsSpaceBefore),
-          argsSpaceAfter: nodeVisitor(token.argsSpaceAfter),
-        });
-      case Token.LogicGroup:
-        return transform({
-          ...token,
-          inner: token.inner.map(nodeVisitor),
-        });
-      case Token.KeyAggregateArgs:
-        return transform({
-          ...token,
-          args: token.args.map(v => ({...v, value: nodeVisitor(v.value)})),
-        });
-      case Token.ValueNumberList:
-      case Token.ValueTextList:
-        return transform({
-          ...token,
-          // TODO(ts): Not sure why `v` cannot be inferred here
-          items: token.items.map((v: any) => ({...v, value: nodeVisitor(v.value)})),
-        });
-
-      default:
-        return transform(token);
-    }
-  };
-
-  return tree.map(nodeVisitor);
-}

+ 0 - 34
tests/fixtures/search-syntax/aggregate_duration_filter.json

@@ -1,34 +0,0 @@
-[
-  {
-    "query": "avg(transaction.duration):>500s",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "aggregateDuration",
-        "negated": false,
-        "key": {
-          "type": "keyAggregate",
-          "name": {"type": "keySimple", "value": "avg", "quoted": false},
-          "args": {
-            "type": "keyAggregateArgs",
-            "args": [
-              {
-                "separator": "",
-                "value": {
-                  "type": "keySimple",
-                  "value": "transaction.duration",
-                  "quoted": false
-                }
-              }
-            ]
-          },
-          "argsSpaceBefore": {"type": "spaces", "value": ""},
-          "argsSpaceAfter": {"type": "spaces", "value": ""}
-        },
-        "operator": ">",
-        "value": {"type": "valueDuration", "value": 500, "unit": "s"}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  }
-]

+ 0 - 35
tests/fixtures/search-syntax/aggregate_duration_filter_overrides_numeric_shorthand.json

@@ -1,35 +0,0 @@
-[
-  {
-    "desc": "2m should mean 2 minutes for duration filters (as opposed to 2 million)",
-    "query": "avg(transaction.duration):>2m",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "aggregateDuration",
-        "negated": false,
-        "key": {
-          "type": "keyAggregate",
-          "name": {"type": "keySimple", "value": "avg", "quoted": false},
-          "args": {
-            "type": "keyAggregateArgs",
-            "args": [
-              {
-                "separator": "",
-                "value": {
-                  "type": "keySimple",
-                  "value": "transaction.duration",
-                  "quoted": false
-                }
-              }
-            ]
-          },
-          "argsSpaceBefore": {"type": "spaces", "value": ""},
-          "argsSpaceAfter": {"type": "spaces", "value": ""}
-        },
-        "operator": ">",
-        "value": {"type": "valueDuration", "value": 2, "unit": "m"}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  }
-]

+ 0 - 56
tests/fixtures/search-syntax/aggregate_rel_time_filter.json

@@ -1,56 +0,0 @@
-[
-  {
-    "query": "last_seen():+7d",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "aggregateRelativeDate",
-        "negated": false,
-        "key": {
-          "type": "keyAggregate",
-          "name": {"type": "keySimple", "value": "last_seen", "quoted": false},
-          "args": null,
-          "argsSpaceBefore": {"type": "spaces", "value": ""},
-          "argsSpaceAfter": {"type": "spaces", "value": ""}
-        },
-        "operator": "",
-        "value": {"type": "valueRelativeDate", "value": 7, "sign": "+", "unit": "d"}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  },
-  {
-    "query": "last_seen():-2w",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "aggregateRelativeDate",
-        "negated": false,
-        "key": {
-          "type": "keyAggregate",
-          "name": {"type": "keySimple", "value": "last_seen", "quoted": false},
-          "args": null,
-          "argsSpaceBefore": {"type": "spaces", "value": ""},
-          "argsSpaceAfter": {"type": "spaces", "value": ""}
-        },
-        "operator": "",
-        "value": {"type": "valueRelativeDate", "value": 2, "sign": "-", "unit": "w"}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  },
-  {
-    "query": "random:-2w",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "text",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "random", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueText", "value": "-2w", "quoted": false}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  }
-]

+ 0 - 100
tests/fixtures/search-syntax/basic_fallthrough.json

@@ -1,100 +0,0 @@
-[
-  {
-    "query": "random:<hello",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "text",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "random", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueText", "value": "<hello", "quoted": false}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  },
-  {
-    "query": "random:<512.1.0",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "text",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "random", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueText", "value": "<512.1.0", "quoted": false}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  },
-  {
-    "query": "random:2018-01-01",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "text",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "random", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueText", "value": "2018-01-01", "quoted": false}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  },
-  {
-    "query": "random:+7d",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "text",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "random", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueText", "value": "+7d", "quoted": false}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  },
-  {
-    "query": "random:>2018-01-01",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "text",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "random", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueText", "value": ">2018-01-01", "quoted": false}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  },
-  {
-    "query": "random:hello",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "text",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "random", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueText", "value": "hello", "quoted": false}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  },
-  {
-    "query": "random:123",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "text",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "random", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueText", "value": "123", "quoted": false}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  }
-]

+ 0 - 100
tests/fixtures/search-syntax/boolean_filter.json

@@ -1,100 +0,0 @@
-[
-  {
-    "query": "stack.in_app:true",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "boolean",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "stack.in_app", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueBoolean", "value": true}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  },
-  {
-    "query": "stack.in_app:TRUE",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "boolean",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "stack.in_app", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueBoolean", "value": true}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  },
-  {
-    "query": "stack.in_app:1",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "boolean",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "stack.in_app", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueBoolean", "value": true}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  },
-  {
-    "query": "stack.in_app:false",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "boolean",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "stack.in_app", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueBoolean", "value": false}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  },
-  {
-    "query": "stack.in_app:FALSE",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "boolean",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "stack.in_app", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueBoolean", "value": false}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  },
-  {
-    "query": "stack.in_app:0",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "boolean",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "stack.in_app", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueBoolean", "value": false}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  },
-  {
-    "query": "!stack.in_app:false",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "boolean",
-        "negated": true,
-        "key": {"type": "keySimple", "value": "stack.in_app", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueBoolean", "value": false}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  }
-]

+ 0 - 16
tests/fixtures/search-syntax/boolean_filter_passthrough.json

@@ -1,16 +0,0 @@
-[
-  {
-    "query": "project_id:1",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "numeric",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "project_id", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueNumber", "value": "1", "rawValue": 1, "unit": null}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  }
-]

+ 0 - 42
tests/fixtures/search-syntax/custom_explicit_tag.json

@@ -1,42 +0,0 @@
-[
-  {
-    "query": "tags[fruit]:apple release:1.2.1 tags[project_id]:123",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "text",
-        "negated": false,
-        "key": {
-          "type": "keyExplicitTag",
-          "prefix": "tags",
-          "key": {"type": "keySimple", "value": "fruit", "quoted": false}
-        },
-        "operator": "",
-        "value": {"type": "valueText", "value": "apple", "quoted": false}
-      },
-      {"type": "spaces", "value": " "},
-      {
-        "type": "filter",
-        "filter": "text",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "release", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueText", "value": "1.2.1", "quoted": false}
-      },
-      {"type": "spaces", "value": " "},
-      {
-        "type": "filter",
-        "filter": "text",
-        "negated": false,
-        "key": {
-          "type": "keyExplicitTag",
-          "prefix": "tags",
-          "key": {"type": "keySimple", "value": "project_id", "quoted": false}
-        },
-        "operator": "",
-        "value": {"type": "valueText", "value": "123", "quoted": false}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  }
-]

+ 0 - 25
tests/fixtures/search-syntax/custom_tag.json

@@ -1,25 +0,0 @@
-[
-  {
-    "query": "fruit:apple release:1.2.1",
-    "result": [
-      {
-        "type": "filter",
-        "filter": "text",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "fruit", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueText", "value": "apple", "quoted": false}
-      },
-      {"type": "spaces", "value": " "},
-      {
-        "type": "filter",
-        "filter": "text",
-        "negated": false,
-        "key": {"type": "keySimple", "value": "release", "quoted": false},
-        "operator": "",
-        "value": {"type": "valueText", "value": "1.2.1", "quoted": false}
-      },
-      {"type": "spaces", "value": ""}
-    ]
-  }
-]

Some files were not shown because too many files changed in this diff