|
42 | 42 | import com.apple.foundationdb.record.provider.foundationdb.IndexMaintainerRegistry;
|
43 | 43 | import com.apple.foundationdb.record.provider.foundationdb.IndexMaintainerRegistryImpl;
|
44 | 44 | import com.apple.foundationdb.record.provider.foundationdb.MetaDataProtoEditor;
|
| 45 | +import com.apple.foundationdb.record.query.plan.cascades.UserDefinedFunction; |
| 46 | +import com.apple.foundationdb.record.query.plan.serialization.DefaultPlanSerializationRegistry; |
| 47 | +import com.apple.foundationdb.record.query.plan.serialization.PlanSerialization; |
45 | 48 | import com.google.common.base.Verify;
|
46 | 49 | import com.google.common.collect.ImmutableMap;
|
47 | 50 | import com.google.common.collect.Maps;
|
@@ -110,6 +113,8 @@ public class RecordMetaDataBuilder implements RecordMetaDataProvider {
|
110 | 113 | @Nonnull
|
111 | 114 | private final Map<String, SyntheticRecordTypeBuilder<?>> syntheticRecordTypes;
|
112 | 115 | @Nonnull
|
| 116 | + private final Map<String, UserDefinedFunction> userDefinedFunctionMap; |
| 117 | + @Nonnull |
113 | 118 | private final Map<String, Index> indexes;
|
114 | 119 | @Nonnull
|
115 | 120 | private final Map<String, Index> universalIndexes;
|
@@ -144,6 +149,7 @@ public class RecordMetaDataBuilder implements RecordMetaDataProvider {
|
144 | 149 | indexMaintainerRegistry = IndexMaintainerRegistryImpl.instance();
|
145 | 150 | evolutionValidator = MetaDataEvolutionValidator.getDefaultInstance();
|
146 | 151 | syntheticRecordTypes = new HashMap<>();
|
| 152 | + userDefinedFunctionMap = new HashMap<>(); |
147 | 153 | }
|
148 | 154 |
|
149 | 155 | private void processSchemaOptions(boolean processExtensionOptions) {
|
@@ -222,6 +228,11 @@ private void loadProtoExceptRecords(@Nonnull RecordMetaDataProto.MetaData metaDa
|
222 | 228 | typeBuilder.setRecordTypeKey(LiteralKeyExpression.fromProtoValue(typeProto.getExplicitKey()));
|
223 | 229 | }
|
224 | 230 | }
|
| 231 | + for (RecordMetaDataProto.PUserDefinedFunction function: metaDataProto.getUserDefinedFunctionsList()) { |
| 232 | + UserDefinedFunction func = (UserDefinedFunction)PlanSerialization.dispatchFromProtoContainer(new PlanSerializationContext(DefaultPlanSerializationRegistry.INSTANCE, |
| 233 | + PlanHashable.CURRENT_FOR_CONTINUATION), function); |
| 234 | + userDefinedFunctionMap.put(func.getFunctionName(), func); |
| 235 | + } |
225 | 236 | if (metaDataProto.hasSplitLongRecords()) {
|
226 | 237 | splitLongRecords = metaDataProto.getSplitLongRecords();
|
227 | 238 | }
|
@@ -1179,6 +1190,14 @@ public void addFormerIndex(@Nonnull FormerIndex formerIndex) {
|
1179 | 1190 | formerIndexes.add(formerIndex);
|
1180 | 1191 | }
|
1181 | 1192 |
|
| 1193 | + public void addUserDefinedFunction(@Nonnull UserDefinedFunction userDefinedFunction) { |
| 1194 | + userDefinedFunctionMap.put(userDefinedFunction.getFunctionName(), userDefinedFunction); |
| 1195 | + } |
| 1196 | + |
| 1197 | + public void addUserDefinedFunctions(@Nonnull Iterable<? extends UserDefinedFunction> functions) { |
| 1198 | + functions.forEach(this::addUserDefinedFunction); |
| 1199 | + } |
| 1200 | + |
1182 | 1201 | public boolean isSplitLongRecords() {
|
1183 | 1202 | return splitLongRecords;
|
1184 | 1203 | }
|
@@ -1420,7 +1439,7 @@ public RecordMetaData build(boolean validate) {
|
1420 | 1439 | Map<Object, SyntheticRecordType<?>> recordTypeKeyToSyntheticRecordTypeMap = Maps.newHashMapWithExpectedSize(syntheticRecordTypes.size());
|
1421 | 1440 | RecordMetaData metaData = new RecordMetaData(recordsDescriptor, getUnionDescriptor(), unionFields,
|
1422 | 1441 | builtRecordTypes, builtSyntheticRecordTypes, recordTypeKeyToSyntheticRecordTypeMap,
|
1423 |
| - indexes, universalIndexes, formerIndexes, |
| 1442 | + indexes, universalIndexes, formerIndexes, userDefinedFunctionMap, |
1424 | 1443 | splitLongRecords, storeRecordVersions, version, subspaceKeyCounter, usesSubspaceKeyCounter, recordCountKey, localFileDescriptor != null);
|
1425 | 1444 | for (RecordTypeBuilder recordTypeBuilder : recordTypes.values()) {
|
1426 | 1445 | KeyExpression primaryKey = recordTypeBuilder.getPrimaryKey();
|
|
0 commit comments