Skip to content

Instantly share code, notes, and snippets.

@ffffranklin
Created June 22, 2017 18:07
Show Gist options
  • Save ffffranklin/a13e5586c39866de182e92c9dcd835bb to your computer and use it in GitHub Desktop.
Save ffffranklin/a13e5586c39866de182e92c9dcd835bb to your computer and use it in GitHub Desktop.
Case vs Lookup with type discrimination support
/**
* Prop getter
* @inspiredby https://blog.mariusschulz.com/2017/01/06/typescript-2-1-keyof-and-lookup-types
*/
function prop<T, K extends keyof T>(obj: T, key: K) {
return obj.hasOwnProperty(key) ? obj[key] : undefined;
}
export function buildAddFieldParams(field: ModelFieldTypes, zone: 'DISCRETE' | 'CONTINUOUS' | 'AGGREGATE'): EncField {
let lookup = {
STRING: {
AGGREGATE: {
formula: `COUNT([${field.name}])`,
variable: { type: 'CONTINUOUS' }
},
DISCRETE: {
formula: `[${field.name}]`,
variable: { type: 'DISCRETE' }
}
},
DATE: {},
DATETIME: {
AGGREGATE: {
formula: `COUNT([${field.name}])`,
variable: { type: 'CONTINUOUS' }
},
CONTINUOUS: {
formula: `DATETRUNC('day', [${field.name}])`,
variable: { type: 'CONTINUOUS' }
},
DISCRETE: {
formula: `DATEPART('year', [${field.name}])`,
variable: { type: 'DISCRETE' }
}
}
}
return prop(prop(lookup, field.dataType), zone);
}
export function buildAddFieldParams(field: ModelFieldTypes, zone: 'DISCRETE' | 'CONTINUOUS' | 'AGGREGATE'): EncField {
switch (field.dataType) {
case 'BOOLEAN':
case 'STRING':
switch (zone) {
case 'AGGREGATE':
return {
formula: `COUNT([${field.name}])`,
variable: { type: 'CONTINUOUS' }
};
case 'CONTINUOUS':
case 'DISCRETE':
return {
formula: `[${field.name}]`,
variable: { type: 'DISCRETE' }
};
}
break;
case 'DATE':
case 'DATETIME':
switch (zone) {
case 'AGGREGATE':
return {
formula: `COUNT([${field.name}])`,
variable: { type: 'CONTINUOUS' }
};
case 'CONTINUOUS':
return {
formula: `DATETRUNC('day', [${field.name}])`,
variable: { type: 'CONTINUOUS' }
};
case 'DISCRETE':
return {
formula: `DATEPART('year', [${field.name}])`,
variable: { type: 'DISCRETE' }
};
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment