{"record":{"id":"8ecf4e193bcefba9","repo":"languagetool-org/languagetool","slug":"neither-pos-tag-nor-term-set-for-element-patter","errorCode":null,"errorMessage":"Neither POS tag nor term set for element: + patternToken","messagePattern":"Neither POS tag nor term set for element: \\+ patternToken","errorType":"exception","errorClass":"UnsupportedPatternRuleException","httpStatus":null,"severity":"error","filePath":"languagetool-wikipedia/src/main/java/org/languagetool/dev/index/PatternRuleQueryBuilder.java","lineNumber":118,"sourceCode":"    if (termQuery != null && posQuery != null) {\n      // if both term and POS are set, we create a query where both are at the same position\n      if (mustOccur(termQuery) && mustOccur(posQuery)) {\n        SpanQuery spanQueryForTerm = asSpanQuery(termQuery);\n        SpanQuery spanQueryForPos = asSpanQuery(posQuery);\n        SpanQuery[] spanClauses = {spanQueryForTerm, spanQueryForPos};\n        return new BooleanClause(new SpanNearQuery(spanClauses, 0, false), BooleanClause.Occur.MUST);\n      } else {\n        // should not happen, we always use Occur.MUST:\n        throw new UnsupportedPatternRuleException(\"Term/POS combination not supported yet: \" + patternToken);\n      }\n    \n    } else if (termQuery != null) {\n      return termQuery;\n\n    } else if (posQuery != null) {\n      return posQuery;\n    }\n    throw new UnsupportedPatternRuleException(\"Neither POS tag nor term set for element: \" + patternToken);\n  }\n\n  private SpanQuery asSpanQuery(BooleanClause query) {\n    if (query.getQuery() instanceof MultiTermQuery) {\n      return new SpanMultiTermQueryWrapper<>((MultiTermQuery) query.getQuery());\n    } else {\n      Set<Term> terms = new HashSet<>();\n      try {\n        indexSearcher.createWeight(query.getQuery(), false).extractTerms(terms);\n      } catch (IOException e) {\n        throw new RuntimeException(e);\n      }\n      if (terms.size() != 1) {\n        throw new RuntimeException(\"Expected term set of size 1: \" + terms);\n      }\n      return new SpanTermQuery(terms.iterator().next());\n    }\n  }","sourceCodeStart":100,"sourceCodeEnd":136,"githubUrl":"https://github.com/languagetool-org/languagetool/blob/2e990059ce67d5e2a0f7f7ca5d31160c6709df4b/languagetool-wikipedia/src/main/java/org/languagetool/dev/index/PatternRuleQueryBuilder.java#L100-L136","documentation":"Search-index guard in makeQuery: the pattern element has neither a POS tag nor a literal term, so no index query can be built for it. Reached via the relaxed build path when all tokens are unusable.","triggerScenarios":"Thrown at languagetool-wikipedia/src/main/java/org/languagetool/dev/index/PatternRuleQueryBuilder.java:118 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Set a term or POS tag on that pattern element","Remove the empty element from the rule","Skip the rule when building index queries"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"2e990059ce67d5e2a0f7f7ca5d31160c6709df4b","analyzedAt":"2026-09-06T09:20:17.015Z","contentChangedAt":"2026-09-06T09:20:17.015Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}