All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.yahoo.vespa.documentmodel.DocumentSummary Maven / Gradle / Ivy

// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.documentmodel;

import com.yahoo.config.application.api.DeployLogger;
import com.yahoo.schema.Schema;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import static java.util.logging.Level.WARNING;

/**
 * A document summary definition - a list of summary fields.
 *
 * @author bratseth
 */
public class DocumentSummary extends FieldView {

    private boolean fromDisk = false;
    private boolean omitSummaryFeatures = false;
    private final List inherited = new ArrayList<>();

    private final Schema owner;

    /** Creates a DocumentSummary with the given name. */
    public DocumentSummary(String name, Schema owner) {
        super(name);
        this.owner = owner;
    }

    public void setFromDisk(boolean fromDisk) { this.fromDisk = fromDisk; }

    /** Returns whether the user has noted explicitly that this summary accesses disk */
    public boolean isFromDisk() { return fromDisk; }

    public void setOmitSummaryFeatures(boolean value) {
        omitSummaryFeatures = value;
    }

    public boolean omitSummaryFeatures() {
        return omitSummaryFeatures;
    }

    /**
     * The model is constrained to ensure that summary fields of the same name
     * in different classes have the same summary transform, because this is
     * what is supported by the backend currently.
     * 
     * @param summaryField the summaryfield to add
     */
    public void add(SummaryField summaryField) {
        summaryField.addDestination(getName());
        super.add(summaryField);
    }

    public SummaryField getSummaryField(String name) {
        var field = (SummaryField)get(name);
        if (field != null) return field;
        if (inherited().isEmpty()) return null;
        for (var inheritedSummary : inherited()) {
            var inheritedField = inheritedSummary.getSummaryField(name);
            if (inheritedField != null)
                return inheritedField;
        }
        return null;
    }

    public Map getSummaryFields() {
        var allFields = new LinkedHashMap(getFields().size());
        for (var inheritedSummary : inherited()) {
            if (inheritedSummary == null) continue;
            allFields.putAll(inheritedSummary.getSummaryFields());
        }
        for (var field : getFields())
            allFields.put(field.getName(), (SummaryField) field);
        return allFields;
    }

    /**
     * Removes implicit fields which shouldn't be included.
     * This is implicitly added fields which are sources for
     * other fields. We then assume they are not intended to be added
     * implicitly in addition.
     * This should be called when this summary is complete.
     */
    public void purgeImplicits() {
        List falseImplicits = new ArrayList<>();
        for (SummaryField summaryField : getSummaryFields().values()) {
            if (summaryField.isImplicit()) continue;
            for (Iterator j = summaryField.sourceIterator(); j.hasNext(); ) {
                String sourceName = j.next().getName();
                if (sourceName.equals(summaryField.getName())) continue;
                SummaryField sourceField=getSummaryField(sourceName);
                if (sourceField == null) continue;
                if (!sourceField.isImplicit()) continue;
                falseImplicits.add(sourceField);
            }
        }
        for (SummaryField field : falseImplicits) {
            remove(field.getName());
        }
    }

    /** Adds a parent of this. Both summaries must be present in the same schema, or a parent schema. */
    public void addInherited(String inherited) {
        this.inherited.add(inherited);
    }

    /** Returns the parent of this, if any */
    public List inherited() {
        return inherited.stream().map(owner::getSummary).toList();
    }

    @Override
    public String toString() {
        return "document-summary '" + getName() + "'";
    }

    public void validate(DeployLogger logger) {
        for (var inheritedName : inherited) {
            var inheritedSummary = owner.getSummary(inheritedName);
            // TODO: Throw when no one is doing this anymore
            if (inheritedName.equals("default"))
                logger.logApplicationPackage(WARNING, this + " inherits '" + inheritedName + "', which makes no sense. Remove this inheritance");
            else if (inheritedSummary == null )
                throw new IllegalArgumentException(this + " inherits '" + inheritedName + "', but this is not present in " + owner);
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy