blob: 17929948f014e7b5b616e241819b6da043af4138 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.searchdefinition.derived;
import com.yahoo.search.config.SchemaInfoConfig;
import com.yahoo.searchdefinition.RankProfile;
import com.yahoo.searchdefinition.RankProfileRegistry;
import com.yahoo.searchdefinition.Schema;
import com.yahoo.searchlib.rankingexpression.Reference;
import com.yahoo.tensor.TensorType;
import com.yahoo.vespa.config.search.SummarymapConfig;
import com.yahoo.vespa.documentmodel.SummaryTransform;
import com.yahoo.vespa.model.search.SearchCluster;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Information about a schema.
*
* @author bratseth
*/
public final class SchemaInfo implements SchemaInfoConfig.Producer {
private final Schema schema;
// Info about profiles needed in memory after build.
// The rank profile registry itself is not kept around due to its size.
private final Map<String, RankProfileInfo> rankProfiles;
private final Summaries summaries;
private final SummaryMap summaryMap;
public SchemaInfo(Schema schema, RankProfileRegistry rankProfileRegistry,
Summaries summaries, SummaryMap summaryMap) {
this.schema = schema;
this.rankProfiles = Collections.unmodifiableMap(toRankProfiles(rankProfileRegistry.rankProfilesOf(schema)));
this.summaries = summaries;
this.summaryMap = summaryMap;
}
public String name() { return schema.getName(); }
public Schema fullSchema() { return schema; }
public Map<String, RankProfileInfo> rankProfiles() { return rankProfiles; }
private Map<String, RankProfileInfo> toRankProfiles(Collection<RankProfile> rankProfiles) {
Map<String, RankProfileInfo> rankProfileInfos = new LinkedHashMap<>();
rankProfiles.forEach(profile -> rankProfileInfos.put(profile.name(), new RankProfileInfo(profile)));
return rankProfileInfos;
}
@Override
public void getConfig(SchemaInfoConfig.Builder builder) {
var schemaBuilder = new SchemaInfoConfig.Schema.Builder();
schemaBuilder.name(schema.getName());
addSummaryConfig(schemaBuilder);
addRankProfilesConfig(schemaBuilder);
builder.schema(schemaBuilder);
}
private void addSummaryConfig(SchemaInfoConfig.Schema.Builder schemaBuilder) {
for (var summary : summaries.asList()) {
var summaryBuilder = new SchemaInfoConfig.Schema.Summaryclass.Builder();
summaryBuilder.id(summary.id()).name(summary.getName());
for (var field : summary.fields().values()) {
var fieldsBuilder = new SchemaInfoConfig.Schema.Summaryclass.Fields.Builder();
fieldsBuilder.name(field.getName())
.type(field.getType().getName())
.dynamic(isDynamic(field.getName()));
summaryBuilder.fields(fieldsBuilder);
}
schemaBuilder.summaryclass(summaryBuilder);
}
}
/** Returns whether the given field is a dynamic summary field. */
private boolean isDynamic(String fieldName) {
if (summaryMap == null) return false; // not know for streaming, but also not used
var fieldTransform = summaryMap.resultTransforms().get(fieldName);
if (fieldTransform == null) return false;
// TODO: Move this into SummaryTransform and call it something else than "dynamic"
return fieldTransform.getTransform().isDynamic() ||
fieldTransform.getTransform() == SummaryTransform.MATCHED_ELEMENTS_FILTER ||
fieldTransform.getTransform() == SummaryTransform.MATCHED_ATTRIBUTE_ELEMENTS_FILTER;
}
private void addRankProfilesConfig(SchemaInfoConfig.Schema.Builder schemaBuilder) {
for (RankProfileInfo rankProfile : rankProfiles().values()) {
var rankProfileConfig = new SchemaInfoConfig.Schema.Rankprofile.Builder();
rankProfileConfig.name(rankProfile.name());
rankProfileConfig.hasSummaryFeatures(rankProfile.hasSummaryFeatures());
rankProfileConfig.hasRankFeatures(rankProfile.hasRankFeatures());
for (var input : rankProfile.inputs().entrySet()) {
var inputConfig = new SchemaInfoConfig.Schema.Rankprofile.Input.Builder();
inputConfig.name(input.getKey().toString());
inputConfig.type(input.getValue().toString());
rankProfileConfig.input(inputConfig);
}
schemaBuilder.rankprofile(rankProfileConfig);
}
}
/** A store of a *small* (in memory) amount of rank profile info. */
public static final class RankProfileInfo {
private final String name;
private final boolean hasSummaryFeatures;
private final boolean hasRankFeatures;
private final Map<Reference, TensorType> inputs;
public RankProfileInfo(RankProfile profile) {
this.name = profile.name();
this.hasSummaryFeatures = ! profile.getSummaryFeatures().isEmpty();
this.hasRankFeatures = ! profile.getRankFeatures().isEmpty();
this.inputs = profile.inputs();
}
public String name() { return name; }
public boolean hasSummaryFeatures() { return hasSummaryFeatures; }
public boolean hasRankFeatures() { return hasRankFeatures; }
public Map<Reference, TensorType> inputs() { return inputs; }
}
}
|