test_class.declarator: EXPECTED_FUNCTION_NAMES = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
              "filter",
              "default",
              "substring-before",
              "substring-after",
              "lower",
              "upper",
              "delete"
      )))
test_class.modifier: private static final
test_class.original_string: private static final Set<String> EXPECTED_FUNCTION_NAMES = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
              "filter",
              "default",
              "substring-before",
              "substring-after",
              "lower",
              "upper",
              "delete"
      )));
test_class.type: Set<String>
test_class.var_name: EXPECTED_FUNCTION_NAMES
test_class.declarator: HEADERS_PLACEHOLDER = PlaceholderFactory.newHeadersPlaceholder()
test_class.modifier: private static final
test_class.original_string: private static final HeadersPlaceholder HEADERS_PLACEHOLDER = PlaceholderFactory.newHeadersPlaceholder();
test_class.type: HeadersPlaceholder
test_class.var_name: HEADERS_PLACEHOLDER
test_class.declarator: THING_PLACEHOLDER = PlaceholderFactory.newThingPlaceholder()
test_class.modifier: private static final
test_class.original_string: private static final ThingPlaceholder THING_PLACEHOLDER = PlaceholderFactory.newThingPlaceholder();
test_class.type: ThingPlaceholder
test_class.var_name: THING_PLACEHOLDER
test_class.declarator: THING_NAME = "test-id"
test_class.modifier: private static final
test_class.original_string: private static final String THING_NAME = "test-id";
test_class.type: String
test_class.var_name: THING_NAME
test_class.declarator: THING_ID = ThingId.of("test.namespace", THING_NAME)
test_class.modifier: private static final
test_class.original_string: private static final ThingId THING_ID = ThingId.of("test.namespace", THING_NAME);
test_class.type: ThingId
test_class.var_name: THING_ID
test_class.declarator: HEADER_KEY = "foo1"
test_class.modifier: private static final
test_class.original_string: private static final String HEADER_KEY = "foo1";
test_class.type: String
test_class.var_name: HEADER_KEY
test_class.declarator: HEADER_VAL = "caMelCasedStuffFOOO"
test_class.modifier: private static final
test_class.original_string: private static final String HEADER_VAL = "caMelCasedStuffFOOO";
test_class.type: String
test_class.var_name: HEADER_VAL
test_class.declarator: HEADERS = Collections.singletonMap(HEADER_KEY, HEADER_VAL)
test_class.modifier: private static final
test_class.original_string: private static final Map<String, String> HEADERS = Collections.singletonMap(HEADER_KEY, HEADER_VAL);
test_class.type: Map<String, String>
test_class.var_name: HEADERS
test_class.declarator: EXPRESSION_RESOLVER = PlaceholderFactory.newExpressionResolver(
              PlaceholderFactory.newPlaceholderResolver(HEADERS_PLACEHOLDER, HEADERS),
              PlaceholderFactory.newPlaceholderResolver(THING_PLACEHOLDER, THING_ID)
      )
test_class.modifier: private static final
test_class.original_string: private static final ExpressionResolver EXPRESSION_RESOLVER = PlaceholderFactory.newExpressionResolver(
              PlaceholderFactory.newPlaceholderResolver(HEADERS_PLACEHOLDER, HEADERS),
              PlaceholderFactory.newPlaceholderResolver(THING_PLACEHOLDER, THING_ID)
      );
test_class.type: ExpressionResolver
test_class.var_name: EXPRESSION_RESOLVER
test_class.declarator: UNDER_TEST = ImmutableFunctionExpression.INSTANCE
test_class.modifier: private static final
test_class.original_string: private static final ImmutableFunctionExpression UNDER_TEST = ImmutableFunctionExpression.INSTANCE;
test_class.type: ImmutableFunctionExpression
test_class.var_name: UNDER_TEST
test_class.file: model/placeholders/src/test/java/org/eclipse/ditto/model/placeholders/ImmutableFunctionExpressionTest.java
test_class.identifier: ImmutableFunctionExpressionTest
test_case.body: @Test
      public void testFunctionLower() {
          assertThat(UNDER_TEST.resolve("fn:lower()", PipelineElement.resolved(HEADER_VAL), EXPRESSION_RESOLVER))
                  .contains(HEADER_VAL.toLowerCase());
      }
test_case.class_method_signature: ImmutableFunctionExpressionTest.testFunctionLower()
test_case.full_signature: @Test public void testFunctionLower()
test_case.identifier: testFunctionLower
test_case.invocations: contains assertThat resolve resolved toLowerCase
test_case.modifiers: @Test public
test_case.parameters: ()
test_case.return: void
test_case.signature: void testFunctionLower()
focal_class.declarator: INSTANCE = new ImmutableFunctionExpression()
focal_class.modifier: static final
focal_class.original_string: static final ImmutableFunctionExpression INSTANCE = new ImmutableFunctionExpression();
focal_class.type: ImmutableFunctionExpression
focal_class.var_name: INSTANCE
focal_class.declarator: SUPPORTED = Collections.unmodifiableList(Arrays.asList(
              new PipelineFunctionFilter(),          // fn:filter(filterValue,rqlFunction,comparedValue)
              new PipelineFunctionDefault(),         // fn:default('fallback value')
              new PipelineFunctionSubstringBefore(), // fn:substring-before(':')
              new PipelineFunctionSubstringAfter(),  // fn:substring-after(':')
              new PipelineFunctionLower(),           // fn:lower()
              new PipelineFunctionUpper(),           // fn:upper()
              new PipelineFunctionDelete()           // fn:delete()
      ))
focal_class.modifier: private static final
focal_class.original_string: private static final List<PipelineFunction> SUPPORTED = Collections.unmodifiableList(Arrays.asList(
              new PipelineFunctionFilter(),          // fn:filter(filterValue,rqlFunction,comparedValue)
              new PipelineFunctionDefault(),         // fn:default('fallback value')
              new PipelineFunctionSubstringBefore(), // fn:substring-before(':')
              new PipelineFunctionSubstringAfter(),  // fn:substring-after(':')
              new PipelineFunctionLower(),           // fn:lower()
              new PipelineFunctionUpper(),           // fn:upper()
              new PipelineFunctionDelete()           // fn:delete()
      ));
focal_class.type: List<PipelineFunction>
focal_class.var_name: SUPPORTED
focal_class.file: model/placeholders/src/main/java/org/eclipse/ditto/model/placeholders/ImmutableFunctionExpression.java
focal_class.identifier: ImmutableFunctionExpression
focal_class.interfaces: implements FunctionExpression
focal_class.class_method_signature: ImmutableFunctionExpression.getPrefix()
focal_class.full_signature: @Override public String getPrefix()
focal_class.identifier: getPrefix
focal_class.modifiers: @Override public
focal_class.parameters: ()
focal_class.return: String
focal_class.signature: String getPrefix()
focal_class.class_method_signature: ImmutableFunctionExpression.getSupportedNames()
focal_class.full_signature: @Override public List<String> getSupportedNames()
focal_class.identifier: getSupportedNames
focal_class.modifiers: @Override public
focal_class.parameters: ()
focal_class.return: List<String>
focal_class.signature: List<String> getSupportedNames()
focal_class.class_method_signature: ImmutableFunctionExpression.supports(final String expressionName)
focal_class.full_signature: @Override public boolean supports(final String expressionName)
focal_class.identifier: supports
focal_class.modifiers: @Override public
focal_class.parameters: (final String expressionName)
focal_class.return: boolean
focal_class.signature: boolean supports(final String expressionName)
focal_class.class_method_signature: ImmutableFunctionExpression.resolve(final String expression, final PipelineElement resolvedInputValue,
              final ExpressionResolver expressionResolver)
focal_class.full_signature: @Override public PipelineElement resolve(final String expression, final PipelineElement resolvedInputValue,
              final ExpressionResolver expressionResolver)
focal_class.identifier: resolve
focal_class.modifiers: @Override public
focal_class.parameters: (final String expression, final PipelineElement resolvedInputValue,
              final ExpressionResolver expressionResolver)
focal_class.return: PipelineElement
focal_class.signature: PipelineElement resolve(final String expression, final PipelineElement resolvedInputValue,
              final ExpressionResolver expressionResolver)
focal_method.body: @Override
      public PipelineElement resolve(final String expression, final PipelineElement resolvedInputValue,
              final ExpressionResolver expressionResolver) {
  
          if (!supports(expression.replaceFirst(getPrefix() + ":", ""))) {
              throw PlaceholderFunctionUnknownException.newBuilder(expression).build();
          }
  
          return SUPPORTED.stream()
                  .filter(pf -> expression.startsWith(getPrefix() + ":" + pf.getName() + "("))
                  .map(pf -> pf.apply(resolvedInputValue,
                          expression.replaceFirst(getPrefix() + ":" + pf.getName(), "").trim(),
                          expressionResolver)
                  )
                  .findFirst()
                  .orElse(PipelineElement.unresolved());
      }
focal_method.class_method_signature: ImmutableFunctionExpression.resolve(final String expression, final PipelineElement resolvedInputValue,
              final ExpressionResolver expressionResolver)
focal_method.full_signature: @Override public PipelineElement resolve(final String expression, final PipelineElement resolvedInputValue,
              final ExpressionResolver expressionResolver)
focal_method.identifier: resolve
focal_method.invocations: supports replaceFirst getPrefix build newBuilder orElse findFirst map filter stream startsWith getPrefix getName apply trim replaceFirst getPrefix getName unresolved
focal_method.modifiers: @Override public
focal_method.parameters: (final String expression, final PipelineElement resolvedInputValue,
              final ExpressionResolver expressionResolver)
focal_method.return: PipelineElement
focal_method.signature: PipelineElement resolve(final String expression, final PipelineElement resolvedInputValue,
              final ExpressionResolver expressionResolver)