@Test
  public void fulltext_wildcard_paths() throws Exception {
    final PropertyTree data = new PropertyTree();
    final String path1 = "test.of.string-1.with.path-1";
    final String value1 = "fisk ost pølse løk";
    data.setString(path1, value1);

    createNode(
        CreateNodeParams.create()
            .name("node1")
            .parent(NodePath.ROOT)
            .data(data)
            .indexConfigDocument(
                PatternIndexConfigDocument.create()
                    .analyzer(NodeConstants.DOCUMENT_INDEX_DEFAULT_ANALYZER)
                    .defaultConfig(IndexConfig.BY_TYPE)
                    .build())
            .build());

    final PropertyTree data2 = new PropertyTree();
    final String path2 = "test.of.string-2.with.path-2";
    final String value2 = "fisk ost pølse løk";
    data2.setString(path2, value2);

    createNode(
        CreateNodeParams.create()
            .name("node2")
            .parent(NodePath.ROOT)
            .data(data2)
            .indexConfigDocument(
                PatternIndexConfigDocument.create()
                    .analyzer(NodeConstants.DOCUMENT_INDEX_DEFAULT_ANALYZER)
                    .defaultConfig(IndexConfig.BY_TYPE)
                    .build())
            .build());

    queryAndAssert("fulltext('test*', 'leter etter fisk', 'OR')", 2);
    queryAndAssert("fulltext('test.*', 'leter etter fisk', 'OR')", 2);
    queryAndAssert("fulltext('test.of*', 'leter etter fisk', 'OR')", 2);
    queryAndAssert("fulltext('test.of.string*', 'leter etter fisk', 'OR')", 2);
    queryAndAssert("fulltext('test.of.string-1.*', 'leter etter fisk', 'OR')", 1);
    queryAndAssert("fulltext('test.of.string-2.*', 'leter etter fisk', 'OR')", 1);
    queryAndAssert("fulltext('*path*', 'leter etter fisk', 'OR')", 2);
    queryAndAssert("fulltext('*path', 'leter etter fisk', 'OR')", 0);
    queryAndAssert("fulltext('*path-1', 'leter etter fisk', 'OR')", 1);
    queryAndAssert("fulltext('*path-2', 'leter etter fisk', 'OR')", 1);
  }
  @Test
  public void negate() throws Exception {
    final PropertyTree data = new PropertyTree();
    data.addString("title", "fisk kake");

    final Node node =
        createNode(
            CreateNodeParams.create()
                .name("my-node-1")
                .parent(NodePath.ROOT)
                .data(data)
                .indexConfigDocument(
                    PatternIndexConfigDocument.create()
                        .analyzer(NodeConstants.DOCUMENT_INDEX_DEFAULT_ANALYZER)
                        .defaultConfig(IndexConfig.BY_TYPE)
                        .build())
                .build());

    final PropertyTree data2 = new PropertyTree();
    data2.addString("title", "fisk båt");

    createNode(
        CreateNodeParams.create()
            .name("my-node-2")
            .parent(NodePath.ROOT)
            .data(data2)
            .indexConfigDocument(
                PatternIndexConfigDocument.create()
                    .analyzer(NodeConstants.DOCUMENT_INDEX_DEFAULT_ANALYZER)
                    .defaultConfig(IndexConfig.BY_TYPE)
                    .build())
            .build());

    final NodeQuery query =
        NodeQuery.create()
            .query(
                QueryExpr.from(
                    new DynamicConstraintExpr(
                        FunctionExpr.from(
                            "fulltext",
                            ValueExpr.string("title"),
                            ValueExpr.string("fisk -båt"),
                            ValueExpr.string("AND")))))
            .build();

    final FindNodesByQueryResult result = doFindByQuery(query);

    assertEquals(1, result.getNodes().getSize());
    assertNotNull(result.getNodes().getNodeById(node.id()));
  }
  private void createWithTitleAndDescription(
      final String id, final String title, final String description) {
    final PropertyTree data = new PropertyTree();
    data.addString("title", title);
    if (!Strings.isNullOrEmpty(description)) {
      data.addString("description", description);
    }

    createNode(
        CreateNodeParams.create()
            .setNodeId(NodeId.from(id))
            .name(title)
            .parent(NodePath.ROOT)
            .data(data)
            .indexConfigDocument(
                PatternIndexConfigDocument.create()
                    .analyzer(NodeConstants.DOCUMENT_INDEX_DEFAULT_ANALYZER)
                    .defaultConfig(IndexConfig.BY_TYPE)
                    .build())
            .build());
  }