annis.sqlgen.annopool.ApAnnotateSqlGenerator.java Source code

Java tutorial

Introduction

Here is the source code for annis.sqlgen.annopool.ApAnnotateSqlGenerator.java

Source

/*
 * Copyright 2012 SFB 632.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package annis.sqlgen.annopool;

import static annis.sqlgen.TableAccessStrategy.COMPONENT_TABLE;
import static annis.sqlgen.TableAccessStrategy.NODE_TABLE;
import static annis.sqlgen.TableAccessStrategy.RANK_TABLE;
import annis.model.QueryNode;
import annis.ql.parser.QueryData;
import annis.sqlgen.AnnotateSqlGenerator;
import annis.sqlgen.LimitOffsetQueryData;
import annis.sqlgen.SolutionKey;
import annis.sqlgen.TableAccessStrategy;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;

import static annis.sqlgen.SqlConstraints.sqlString;

/**
 *
 *  @author Thomas Krause <thomas.krause@alumni.hu-berlin.de>
 */
public class ApAnnotateSqlGenerator<T> extends AnnotateSqlGenerator<T> {

    @Override
    public String fromClause(QueryData queryData, List<QueryNode> alternative, String indent) {
        TableAccessStrategy tas = createTableAccessStrategy();
        List<Long> corpusList = queryData.getCorpusList();
        StringBuilder sb = new StringBuilder();

        sb.append(indent).append("solutions,\n");

        sb.append(indent).append(TABSTOP);
        // really ugly
        sb.append(getTableJoinsInFromClauseSqlGenerator().fromClauseForNode(null, true));
        sb.append("\n");
        sb.append(indent).append(TABSTOP);
        sb.append("LEFT OUTER JOIN annotation_pool AS node_anno ON  (")
                .append(tas.aliasedColumn(NODE_TABLE, "node_anno_ref")).append(" = node_anno.id AND ")
                .append(tas.aliasedColumn(NODE_TABLE, "toplevel_corpus"))
                .append(" = node_anno.toplevel_corpus AND node_anno.toplevel_corpus IN (")
                .append(StringUtils.join(corpusList, ", ")).append("))");

        sb.append("\n");
        sb.append(indent).append(TABSTOP);
        sb.append("LEFT OUTER JOIN annotation_pool AS edge_anno ON (")
                .append(tas.aliasedColumn(RANK_TABLE, "edge_anno_ref")).append(" = edge_anno.id AND ")
                .append(tas.aliasedColumn(RANK_TABLE, "toplevel_corpus"))
                .append(" = edge_anno.toplevel_corpus AND " + "edge_anno.toplevel_corpus IN (")
                .append(StringUtils.join(corpusList, ", ")).append("))");

        sb.append(",\n");

        sb.append(indent).append(TABSTOP);
        sb.append(TableAccessStrategy.CORPUS_TABLE);

        return sb.toString();
    }

    @Override
    public String selectClause(QueryData queryData, List<QueryNode> alternative, String indent) {
        String innerIndent = indent + TABSTOP;
        StringBuilder sb = new StringBuilder();

        sb.append("DISTINCT\n");

        sb.append(innerIndent).append("solutions.\"key\",\n");
        sb.append(innerIndent);

        int matchStart = 0;
        List<LimitOffsetQueryData> extension = queryData.getExtensions(LimitOffsetQueryData.class);
        if (extension.size() > 0) {
            matchStart = extension.get(0).getOffset();
        }

        sb.append(matchStart).append(" AS \"matchstart\",\n");
        sb.append(innerIndent).append("solutions.n,\n");

        List<String> fields = getSelectFields();

        sb.append(innerIndent).append(StringUtils.join(fields, ",\n" + innerIndent));
        sb.append(innerIndent).append(",\n");

        // corpus.path_name
        sb.append(innerIndent).append("corpus.path_name AS path");

        if (isIncludeDocumentNameInAnnotateQuery()) {
            sb.append(",\n");
            sb.append(innerIndent).append("corpus.path_name[1] AS document_name");
        }
        return sb.toString();
    }

    protected List<String> getSelectFields() {
        List<String> fields = new ArrayList<String>();

        addSelectClauseAttribute(fields, NODE_TABLE, "id");
        addSelectClauseAttribute(fields, NODE_TABLE, "text_ref");
        addSelectClauseAttribute(fields, NODE_TABLE, "corpus_ref");
        addSelectClauseAttribute(fields, NODE_TABLE, "toplevel_corpus");
        addSelectClauseAttribute(fields, NODE_TABLE, "namespace");
        addSelectClauseAttribute(fields, NODE_TABLE, "name");
        addSelectClauseAttribute(fields, NODE_TABLE, "left");
        addSelectClauseAttribute(fields, NODE_TABLE, "right");
        addSelectClauseAttribute(fields, NODE_TABLE, "token_index");
        if (isIncludeIsTokenColumn()) {
            addSelectClauseAttribute(fields, NODE_TABLE, "is_token");
        }
        addSelectClauseAttribute(fields, NODE_TABLE, "continuous");
        addSelectClauseAttribute(fields, NODE_TABLE, "span");
        addSelectClauseAttribute(fields, NODE_TABLE, "left_token");
        addSelectClauseAttribute(fields, NODE_TABLE, "right_token");
        addSelectClauseAttribute(fields, NODE_TABLE, "seg_name");
        addSelectClauseAttribute(fields, NODE_TABLE, "seg_index");
        addSelectClauseAttribute(fields, RANK_TABLE, "pre");
        addSelectClauseAttribute(fields, RANK_TABLE, "post");
        addSelectClauseAttribute(fields, RANK_TABLE, "parent");
        addSelectClauseAttribute(fields, RANK_TABLE, "root");
        addSelectClauseAttribute(fields, RANK_TABLE, "level");
        addSelectClauseAttribute(fields, COMPONENT_TABLE, "id");
        addSelectClauseAttribute(fields, COMPONENT_TABLE, "type");
        addSelectClauseAttribute(fields, COMPONENT_TABLE, "name");
        addSelectClauseAttribute(fields, COMPONENT_TABLE, "namespace");

        fields.add("node_anno.\"namespace\" AS node_annotation_namespace");
        fields.add("node_anno.\"name\" AS node_annotation_name");
        fields.add("node_anno.\"val\" AS node_annotation_value");
        fields.add("edge_anno.\"namespace\" AS edge_annotation_namespace");
        fields.add("edge_anno.\"name\" AS edge_annotation_name");
        fields.add("edge_anno.\"val\" AS edge_annotation_value");

        return fields;
    }

    @Override
    public String getDocumentQuery(String toplevelCorpusName, String documentName) {
        TableAccessStrategy tas = createTableAccessStrategy();
        List<String> fields = getSelectFields();

        String template = "SELECT DISTINCT \n"
                + "\tARRAY[-1::bigint] AS key, ARRAY[''::varchar] AS key_names, 0 as matchstart, "
                + StringUtils.join(fields, ", ") + ", " + "c.path_name as path, c.path_name[1] as document_name, "
                + "node_anno.namespace AS node_annotation_namespace, "
                + "node_anno.\"name\" AS node_annotation_name, " + "node_anno.val AS node_annotation_value,\n"
                + "edge_anno.namespace AS edge_annotation_namespace, "
                + "edge_anno.\"name\" AS edge_annotation_name, " + "edge_anno.val AS edge_annotation_value\n"
                + "FROM\n"
                // really ugly
                + "\t" + getTableJoinsInFromClauseSqlGenerator().fromClauseForNode(null, true) + "\n"
                + "\tLEFT OUTER JOIN annotation_pool AS node_anno ON ("
                + tas.aliasedColumn(NODE_TABLE, "node_anno_ref") + " = node_anno.id AND "
                + tas.aliasedColumn(NODE_TABLE, "toplevel_corpus") + " = node_anno.toplevel_corpus)\n"
                + "\tLEFT OUTER JOIN annotation_pool AS edge_anno ON ("
                + tas.aliasedColumn(RANK_TABLE, "edge_anno_ref") + " = edge_anno.id AND "
                + tas.aliasedColumn(RANK_TABLE, "toplevel_corpus") + " = edge_anno.toplevel_corpus),\n"
                + "\tcorpus as c, corpus as toplevel\n" + "WHERE\n"
                + "\ttoplevel.name = :toplevel_name AND c.name = :document_name AND "
                + tas.aliasedColumn(NODE_TABLE, "corpus_ref") + " = c.id\n" + "\tAND toplevel.top_level IS TRUE\n"
                + "\tAND c.pre >= toplevel.pre AND c.post <= toplevel.post\n" + "ORDER BY "
                + tas.aliasedColumn(RANK_TABLE, "pre");
        String sql = template.replace(":toplevel_name", sqlString(toplevelCorpusName)).replace(":document_name",
                sqlString(documentName));
        return sql;
    }
}