Skip to content

Commit 0619371

Browse files
committed
comments
1 parent b208b45 commit 0619371

File tree

5 files changed

+28
-20
lines changed

5 files changed

+28
-20
lines changed

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/RecordMetaData.java

+5-6
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
import java.util.LinkedHashMap;
5151
import java.util.List;
5252
import java.util.Map;
53-
import java.util.Set;
5453
import java.util.TreeMap;
5554
import java.util.concurrent.ConcurrentHashMap;
5655
import java.util.stream.Collectors;
@@ -86,7 +85,7 @@ public class RecordMetaData implements RecordMetaDataProvider {
8685
@Nonnull
8786
private final Map<Object, SyntheticRecordType<?>> recordTypeKeyToSyntheticTypeMap;
8887
@Nonnull
89-
private final Set<UserDefinedFunction> userDefinedFunctions;
88+
private final Map<String, UserDefinedFunction> userDefinedFunctionMap;
9089
@Nonnull
9190
private final Map<String, Index> indexes;
9291
@Nonnull
@@ -117,7 +116,7 @@ protected RecordMetaData(@Nonnull RecordMetaData orig) {
117116
Collections.unmodifiableMap(orig.indexes),
118117
Collections.unmodifiableMap(orig.universalIndexes),
119118
Collections.unmodifiableList(orig.formerIndexes),
120-
Collections.unmodifiableSet(orig.userDefinedFunctions),
119+
Collections.unmodifiableMap(orig.userDefinedFunctionMap),
121120
orig.splitLongRecords,
122121
orig.storeRecordVersions,
123122
orig.version,
@@ -137,7 +136,7 @@ protected RecordMetaData(@Nonnull Descriptors.FileDescriptor recordsDescriptor,
137136
@Nonnull Map<String, Index> indexes,
138137
@Nonnull Map<String, Index> universalIndexes,
139138
@Nonnull List<FormerIndex> formerIndexes,
140-
@Nonnull Set<UserDefinedFunction> userDefinedFunctions,
139+
@Nonnull Map<String, UserDefinedFunction> userDefinedFunctionMap,
141140
boolean splitLongRecords,
142141
boolean storeRecordVersions,
143142
int version,
@@ -154,7 +153,7 @@ protected RecordMetaData(@Nonnull Descriptors.FileDescriptor recordsDescriptor,
154153
this.indexes = indexes;
155154
this.universalIndexes = universalIndexes;
156155
this.formerIndexes = formerIndexes;
157-
this.userDefinedFunctions = userDefinedFunctions;
156+
this.userDefinedFunctionMap = userDefinedFunctionMap;
158157
this.splitLongRecords = splitLongRecords;
159158
this.storeRecordVersions = storeRecordVersions;
160159
this.version = version;
@@ -702,7 +701,7 @@ public RecordMetaDataProto.MetaData toProto(@Nullable Descriptors.FileDescriptor
702701

703702
PlanSerializationContext serializationContext = new PlanSerializationContext(DefaultPlanSerializationRegistry.INSTANCE,
704703
PlanHashable.CURRENT_FOR_CONTINUATION);
705-
builder.addAllUserDefinedFunctions(userDefinedFunctions.stream().map(func -> func.toProto(serializationContext)).collect(Collectors.toList()));
704+
builder.addAllUserDefinedFunctions(userDefinedFunctionMap.values().stream().map(func -> func.toProto(serializationContext)).collect(Collectors.toList()));
706705
builder.setSplitLongRecords(splitLongRecords);
707706
builder.setStoreRecordVersions(storeRecordVersions);
708707
builder.setVersion(version);

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/RecordMetaDataBuilder.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public class RecordMetaDataBuilder implements RecordMetaDataProvider {
112112
@Nonnull
113113
private final Map<String, SyntheticRecordTypeBuilder<?>> syntheticRecordTypes;
114114
@Nonnull
115-
private final Set<UserDefinedFunction> userDefinedFunctions;
115+
private final Map<String, UserDefinedFunction> userDefinedFunctionMap;
116116
@Nonnull
117117
private final Map<String, Index> indexes;
118118
@Nonnull
@@ -148,7 +148,7 @@ public class RecordMetaDataBuilder implements RecordMetaDataProvider {
148148
indexMaintainerRegistry = IndexMaintainerRegistryImpl.instance();
149149
evolutionValidator = MetaDataEvolutionValidator.getDefaultInstance();
150150
syntheticRecordTypes = new HashMap<>();
151-
userDefinedFunctions = new HashSet<>();
151+
userDefinedFunctionMap = new HashMap<>();
152152
}
153153

154154
private void processSchemaOptions(boolean processExtensionOptions) {
@@ -232,7 +232,7 @@ private void loadProtoExceptRecords(@Nonnull RecordMetaDataProto.MetaData metaDa
232232
for (RecordMetaDataProto.UserDefinedFunction function: metaDataProto.getUserDefinedFunctionsList()) {
233233
UserDefinedFunction func = UserDefinedFunction.fromProto(serializationContext, function);
234234
if (func != null) {
235-
userDefinedFunctions.add(func);
235+
userDefinedFunctionMap.put(func.getFunctionName(), func);
236236
}
237237
}
238238
if (metaDataProto.hasSplitLongRecords()) {
@@ -1193,11 +1193,11 @@ public void addFormerIndex(@Nonnull FormerIndex formerIndex) {
11931193
}
11941194

11951195
public void addUserDefinedFunction(@Nonnull UserDefinedFunction userDefinedFunction) {
1196-
userDefinedFunctions.add(userDefinedFunction);
1196+
userDefinedFunctionMap.put(userDefinedFunction.getFunctionName(), userDefinedFunction);
11971197
}
11981198

11991199
public void addUserDefinedFunctions(@Nonnull Iterable<? extends UserDefinedFunction> functions) {
1200-
functions.forEach(this.userDefinedFunctions::add);
1200+
functions.forEach(this::addUserDefinedFunction);
12011201
}
12021202

12031203
public boolean isSplitLongRecords() {
@@ -1441,7 +1441,7 @@ public RecordMetaData build(boolean validate) {
14411441
Map<Object, SyntheticRecordType<?>> recordTypeKeyToSyntheticRecordTypeMap = Maps.newHashMapWithExpectedSize(syntheticRecordTypes.size());
14421442
RecordMetaData metaData = new RecordMetaData(recordsDescriptor, getUnionDescriptor(), unionFields,
14431443
builtRecordTypes, builtSyntheticRecordTypes, recordTypeKeyToSyntheticRecordTypeMap,
1444-
indexes, universalIndexes, formerIndexes, userDefinedFunctions,
1444+
indexes, universalIndexes, formerIndexes, userDefinedFunctionMap,
14451445
splitLongRecords, storeRecordVersions, version, subspaceKeyCounter, usesSubspaceKeyCounter, recordCountKey, localFileDescriptor != null);
14461446
for (RecordTypeBuilder recordTypeBuilder : recordTypes.values()) {
14471447
KeyExpression primaryKey = recordTypeBuilder.getPrimaryKey();

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/CatalogedFunction.java

+11-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
package com.apple.foundationdb.record.query.plan.cascades;
2222

23+
import com.apple.foundationdb.annotation.API;
2324
import com.apple.foundationdb.record.query.plan.cascades.typing.Type;
2425
import com.apple.foundationdb.record.query.plan.cascades.typing.Typed;
2526
import com.google.common.base.Verify;
@@ -30,20 +31,26 @@
3031
import java.util.List;
3132
import java.util.stream.Collectors;
3233

34+
/**
35+
* Main interface for defining all functions that can be evaluated against a number of arguments.
36+
* Two major sub interfaces inherit this interface: {@link BuiltInFunction} and {@link UserDefinedFunction}
37+
* {@link BuiltInFunction} represents all functions that are built-in, and stored in code, while {@link UserDefinedFunction} represents all functions defined by users, and stored in {@link com.apple.foundationdb.record.RecordMetaDataProto.MetaData}
38+
*/
39+
@API(API.Status.EXPERIMENTAL)
3340
public abstract class CatalogedFunction {
3441
@Nonnull
35-
final String functionName;
42+
protected final String functionName;
3643

3744
@Nonnull
38-
final List<Type> parameterTypes;
45+
protected final List<Type> parameterTypes;
3946

4047
/**
4148
* The type of the function's variadic parameters (if any).
4249
*/
4350
@Nullable
44-
final Type variadicSuffixType;
51+
private final Type variadicSuffixType;
4552

46-
public CatalogedFunction(@Nonnull final String functionName, @Nonnull final List<Type> parameterTypes, @Nullable final Type variadicSuffixType) {
53+
protected CatalogedFunction(@Nonnull final String functionName, @Nonnull final List<Type> parameterTypes, @Nullable final Type variadicSuffixType) {
4754
this.functionName = functionName;
4855
this.parameterTypes = ImmutableList.copyOf(parameterTypes);
4956
this.variadicSuffixType = variadicSuffixType;

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/MacroFunction.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,9 @@
3838
* MacroFunction that expands a body (referring to parameters) into a {@link Value} (through encapsulation) call site.
3939
*/
4040
public class MacroFunction extends UserDefinedFunction {
41-
private static final long serialVersionUID = 1L;
42-
4341
@Nonnull
4442
private final Value bodyValue;
43+
@Nonnull
4544
private final List<CorrelationIdentifier> parameterIdentifiers;
4645

4746
public MacroFunction(@Nonnull final String functionName, @Nonnull final List<QuantifiedObjectValue> parameters, @Nonnull final Value bodyValue) {

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/UserDefinedFunction.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
package com.apple.foundationdb.record.query.plan.cascades;
2222

23+
import com.apple.foundationdb.annotation.API;
2324
import com.apple.foundationdb.record.PlanSerializationContext;
2425
import com.apple.foundationdb.record.RecordMetaDataProto;
2526
import com.apple.foundationdb.record.query.plan.cascades.typing.Type;
@@ -29,8 +30,10 @@
2930
import java.util.List;
3031

3132
/**
32-
* User defined functions that are serialized in MetaData.
33+
* Functions that are 1) can be evaluated against a number of arguments; 2) defined by users; 3) serialized to {@link com.apple.foundationdb.record.RecordMetaDataProto.MetaData}
34+
* Right now we don't have namespacing rules to separate UserDefinedFunction and BuiltInFunction, so theoretically there could be a naming collision
3335
*/
36+
@API(API.Status.EXPERIMENTAL)
3437
public abstract class UserDefinedFunction extends CatalogedFunction {
3538

3639
public UserDefinedFunction(@Nonnull final String functionName, @Nonnull final List<Type> parameterTypes) {
@@ -42,7 +45,7 @@ public static UserDefinedFunction fromProto(@Nonnull PlanSerializationContext se
4245
if (proto.hasMacroFunction()) {
4346
return MacroFunction.fromProto(serializationContext, proto);
4447
} else {
45-
return null;
48+
throw new RuntimeException("Invalid UserDefinedFunction protobuf.");
4649
}
4750
}
4851

0 commit comments

Comments
 (0)