Skip to content

Commit

Permalink
Merge pull request #11 from nfl/hash_size
Browse files Browse the repository at this point in the history
BACKEND-2482: Documented the default hash size (and broke it out into
  • Loading branch information
nflearl authored Dec 21, 2017
2 parents e9335fd + e6f80cc commit 3f26f78
Show file tree
Hide file tree
Showing 10 changed files with 42 additions and 16 deletions.
15 changes: 15 additions & 0 deletions src/main/java/com/nfl/dm/shield/dynamic/config/HashConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.nfl.dm.shield.dynamic.config;

/**
* In order to get even distribution of hash codes (avoiding linear performance O(n)), it is best to initialize to
* a prime number. As a hash table grows, one default algorithm increases size by 2n + 1. Sun developers initially
* chose 101 as the default number. However, the growth characteristics of 101 are not as good as other selections.
*
* The book Java 2 Performance and Idiom Guide on page 73 offers the following as optimal initial bucket size:
* 89, 179, 359, 719, 1439, 2879, 11519, 23029, 737279, 1474559, 2949119.
*
* We have chosen 89 as the starting place for all hash tables.
*/
public final class HashConfig {
public static final int DEFAULT_HASH_TABLE_SIZE = 89;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

import static com.nfl.dm.shield.dynamic.config.HashConfig.*;

public class SchemaInstance implements Map<String, Object> {

public static final String ID = "id";
Expand All @@ -12,7 +14,7 @@ public class SchemaInstance implements Map<String, Object> {

public static final String UPDATE_DATE_FIELD = "updateDate";

private Map<String, Object> fieldValues = new ConcurrentHashMap<>(89);
private Map<String, Object> fieldValues = new ConcurrentHashMap<>(DEFAULT_HASH_TABLE_SIZE);

private SchemaInstanceKey schemaInstanceKey;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import static com.nfl.dm.shield.dynamic.config.HashConfig.DEFAULT_HASH_TABLE_SIZE;
import static com.nfl.dm.shield.dynamic.domain.schema.instancefield.SchemaInstanceField.MEMBER_TYPE_FIELD;
import static graphql.Scalars.GraphQLID;
import static graphql.Scalars.GraphQLLong;
Expand Down Expand Up @@ -63,13 +64,13 @@ public class SchemaDescription {

private IdGeneration idGeneration = IdGeneration.SERVICE_GENERATED_GUID;

private List<SchemaInstanceField> domainFields = new ArrayList<>(89);
private List<SchemaInstanceField> domainFields = new ArrayList<>(DEFAULT_HASH_TABLE_SIZE);

private List<ValueObjectField> valueDefinitions = new ArrayList<>(89);
private List<ValueObjectField> valueDefinitions = new ArrayList<>(DEFAULT_HASH_TABLE_SIZE);

private String memberConfiguration;

private List<FilterConfiguration> filterConfigurations = new ArrayList<>(89);
private List<FilterConfiguration> filterConfigurations = new ArrayList<>(DEFAULT_HASH_TABLE_SIZE);

public SchemaDescription() {
}
Expand All @@ -94,7 +95,7 @@ private void initMembers(Map<String, Object> initValues, InstanceOutputTypeServi
}

private void initValuesDefinitions(List<Map<String, Object>> valueDefinitions, InstanceOutputTypeService instanceOutputTypeService) {
setValueDefinitions(new ArrayList<>(89));
setValueDefinitions(new ArrayList<>(DEFAULT_HASH_TABLE_SIZE));
valueDefinitions.forEach(valueDef -> addValueDefinition(new ValueObjectField(this, valueDef, instanceOutputTypeService)));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import java.util.List;
import java.util.Map;

import static com.nfl.dm.shield.dynamic.config.HashConfig.DEFAULT_HASH_TABLE_SIZE;
import static graphql.Scalars.GraphQLString;
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
import static graphql.schema.GraphQLInputObjectField.newInputObjectField;
Expand All @@ -24,7 +25,7 @@ public class ValueObjectField {

private String name;

private List<SchemaInstanceField> valueFields = new ArrayList<>(89);
private List<SchemaInstanceField> valueFields = new ArrayList<>(DEFAULT_HASH_TABLE_SIZE);

public ValueObjectField() {
// For persistence
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.util.List;
import java.util.Map;

import static com.nfl.dm.shield.dynamic.config.HashConfig.DEFAULT_HASH_TABLE_SIZE;
import static graphql.Scalars.GraphQLID;
import static graphql.Scalars.GraphQLString;
import static graphql.schema.GraphQLInputObjectField.newInputObjectField;
Expand Down Expand Up @@ -55,7 +56,7 @@ public GraphQLOutputType buildInstanceOutputType(InstanceFieldBuilderContext ins

@Override
Map<String, GraphQLObjectType> buildPossibleTypeMap(List<String> possibleTypes, InstanceFieldBuilderContext instanceFieldBuilderContext, InstanceOutputTypeService instanceOutputTypeService) {
Map<String, GraphQLObjectType> retMap = new HashMap<>(89);
Map<String, GraphQLObjectType> retMap = new HashMap<>(DEFAULT_HASH_TABLE_SIZE);
possibleTypes.forEach(possible -> retMap.put(possible,
(GraphQLObjectType) instanceOutputTypeService.deriveFromExternalTypeName(possible)));
return retMap;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import java.util.List;
import java.util.Map;

import static com.nfl.dm.shield.dynamic.config.HashConfig.DEFAULT_HASH_TABLE_SIZE;
import static com.nfl.dm.shield.dynamic.domain.BaseKey.SCHEMA_NAME_FIELD;
import static com.nfl.dm.shield.dynamic.domain.instance.SchemaInstance.SCHEMA_INSTANCE_KEY_FIELD;
import static graphql.Scalars.GraphQLID;
Expand Down Expand Up @@ -60,7 +61,7 @@ public GraphQLOutputType buildInstanceOutputType(InstanceFieldBuilderContext ins
Map<String, GraphQLObjectType> buildPossibleTypeMap(List<String> possibleTypes,
InstanceFieldBuilderContext instanceFieldBuilderContext,
InstanceOutputTypeService instanceOutputTypeService) {
Map<String, GraphQLObjectType> retMap = new HashMap<>(89);
Map<String, GraphQLObjectType> retMap = new HashMap<>(DEFAULT_HASH_TABLE_SIZE);
possibleTypes.forEach(possible -> {
SchemaKey schemaKey = new SchemaKey(possible, instanceFieldBuilderContext.getSchemaNamespace());
SchemaDescription schemaDescription = instanceOutputTypeService.findSchemaDescriptionByName(schemaKey);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import java.util.*;
import java.util.stream.Collectors;

import static com.nfl.dm.shield.dynamic.config.HashConfig.DEFAULT_HASH_TABLE_SIZE;
import static graphql.Scalars.GraphQLString;
import static graphql.schema.GraphQLEnumType.newEnum;
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
Expand Down Expand Up @@ -46,7 +47,7 @@ public class SchemaInstanceField {

private String otherTypeName = "";

private List<EnumValueDef> enumValues = new ArrayList<>(89);
private List<EnumValueDef> enumValues = new ArrayList<>(DEFAULT_HASH_TABLE_SIZE);

private String serviceKey;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.util.stream.Stream;

import static com.google.common.collect.Lists.transform;
import static com.nfl.dm.shield.dynamic.config.HashConfig.DEFAULT_HASH_TABLE_SIZE;
import static com.nfl.dm.shield.dynamic.domain.instance.SchemaInstance.UPDATE_DATE_FIELD;
import static java.util.Collections.emptyList;
import static java.util.Collections.emptyMap;
Expand All @@ -25,10 +26,10 @@
public class InMemorySchemaRepository extends BaseRepositoryImpl
implements SchemaRepository, SchemaInstanceRepository {

private final Map<SchemaKey, InMemorySchemaDescriptionHolder> allTheSchemas = new ConcurrentHashMap<>(89);
private final Map<SchemaKey, InMemorySchemaDescriptionHolder> allTheSchemas = new ConcurrentHashMap<>(DEFAULT_HASH_TABLE_SIZE);

private final Map<SchemaInstanceKey, Map<String, InMemorySchemaInstanceHolder>> instances
= new ConcurrentHashMap<>(89);
= new ConcurrentHashMap<>(DEFAULT_HASH_TABLE_SIZE);

public InMemorySchemaRepository() {
}
Expand Down Expand Up @@ -137,7 +138,7 @@ public SchemaInstance upsert(SchemaInstanceKey schemaInstanceKey, SchemaInstance
}

private Map<String, InMemorySchemaInstanceHolder> initInstance(SchemaInstanceKey schemaInstanceKey) {
Map<String, InMemorySchemaInstanceHolder> retMap = new ConcurrentHashMap<>(89);
Map<String, InMemorySchemaInstanceHolder> retMap = new ConcurrentHashMap<>(DEFAULT_HASH_TABLE_SIZE);
instances.put(schemaInstanceKey, retMap);
return retMap;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

import static com.nfl.dm.shield.dynamic.config.HashConfig.DEFAULT_HASH_TABLE_SIZE;
import static com.nfl.dm.shield.dynamic.domain.schema.instancefield.AbstractReferenceType.REFERENCE_ID;
import static com.nfl.dm.shield.dynamic.domain.schema.instancefield.AbstractReferenceType.REFERENCE_TYPE;
import static graphql.Scalars.GraphQLID;
Expand All @@ -21,7 +22,7 @@
public class StubbedExternalReferenceRepository implements ExternalReferenceRepository {

private final Map<String, Map<String, Map<String, Object>>> externalInstances
= new ConcurrentHashMap<>(89);
= new ConcurrentHashMap<>(DEFAULT_HASH_TABLE_SIZE);

private final Map<String, GraphQLOutputType> outputTypeMap = new ConcurrentHashMap<>(89);

Expand Down Expand Up @@ -54,7 +55,7 @@ public Map<String, Object> findById(SelectionSet selections, Map<String, String>

public void loadExternalInstance(String typeName, String id, Map<String, Object> instance) {
if (!externalInstances.containsKey(typeName)) {
externalInstances.put(typeName, new HashMap<>(89));
externalInstances.put(typeName, new HashMap<>(DEFAULT_HASH_TABLE_SIZE));
}
externalInstances.get(typeName).put(id, instance);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import java.util.Map;
import java.util.Set;

import static com.nfl.dm.shield.dynamic.config.HashConfig.DEFAULT_HASH_TABLE_SIZE;

public class SchemaWriteAccess {

public static final String SCHEMA_MODIFY = "SCHEMA_MODIFY";
Expand All @@ -13,7 +15,7 @@ public class SchemaWriteAccess {

private final String authHeader;

private final Map<String, Set<String>> permissions = new HashMap<>(89);
private final Map<String, Set<String>> permissions = new HashMap<>(DEFAULT_HASH_TABLE_SIZE);

public SchemaWriteAccess() {
authHeader = "Testing only.";
Expand All @@ -27,7 +29,7 @@ public void addPermission(String namespace, String permissionName) {

// Initialize
if (!permissions.containsKey(namespace)) {
permissions.put(namespace, new HashSet<>(89));
permissions.put(namespace, new HashSet<>(DEFAULT_HASH_TABLE_SIZE));
}

permissions.get(namespace).add(permissionName);
Expand Down

0 comments on commit 3f26f78

Please sign in to comment.