Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
### Added

- Added support for the new license key format. A proprietary key can now grant a subset of the library: a function your key does not include evaluates to a `#LIC!` error, and the matching parts of the API throw a `LicenseCapabilityMissingError`. `getAvailableFunctions()` and `getFunctionDetails()` describe only the functions your key includes. [#1728](https://github.com/handsontable/hyperformula/pull/1728)
- Added new functions: RANK.EQ and its alias RANK. [#1786](https://github.com/handsontable/hyperformula/pull/1786)

### Changed

Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/csCZ.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ const dictionary: RawTranslationPackage = {
IMTAN: 'IMTAN',
LARGE: 'LARGE',
SMALL: 'SMALL',
'RANK.EQ': 'RANK.EQ',
RANK: 'RANK',
PERCENTILE: 'PERCENTIL',
'PERCENTILE.INC': 'PERCENTIL.INC',
'PERCENTILE.EXC': 'PERCENTIL.EXC',
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/daDK.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ const dictionary: RawTranslationPackage = {
IMTAN: 'IMAGTAN',
LARGE: 'ST脴RSTE',
SMALL: 'MINDSTE',
'RANK.EQ': 'PLADS.LIGE',
RANK: 'PLADS',
PERCENTILE: 'FRAKTIL',
'PERCENTILE.INC': 'FRAKTIL.MEDTAG',
'PERCENTILE.EXC': 'FRAKTIL.UDELAD',
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/deDE.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ const dictionary: RawTranslationPackage = {
IMTAN: 'IMATAN',
LARGE: 'KGR脰SSTE',
SMALL: 'KKLEINSTE',
'RANK.EQ': 'RANG.GLEICH',
RANK: 'RANG',
PERCENTILE: 'QUANTIL',
'PERCENTILE.INC': 'QUANTIL.INKL',
'PERCENTILE.EXC': 'QUANTIL.EXKL',
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/enGB.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ const dictionary: RawTranslationPackage = {
IMTAN: 'IMTAN',
LARGE: 'LARGE',
SMALL: 'SMALL',
'RANK.EQ': 'RANK.EQ',
RANK: 'RANK',
PERCENTILE: 'PERCENTILE',
'PERCENTILE.INC': 'PERCENTILE.INC',
'PERCENTILE.EXC': 'PERCENTILE.EXC',
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/esES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ export const dictionary: RawTranslationPackage = {
IMTAN: 'IMTAN',
LARGE: 'K.ESIMO.MAYOR',
SMALL: 'K.ESIMO.MENOR',
'RANK.EQ': 'JERARQUIA.EQV',
RANK: 'JERARQUIA',
PERCENTILE: 'PERCENTIL',
'PERCENTILE.INC': 'PERCENTIL.INC',
'PERCENTILE.EXC': 'PERCENTIL.EXC',
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/fiFI.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ const dictionary: RawTranslationPackage = {
IMTAN: 'KOMPLEKSI.TAN',
LARGE: 'SUURI',
SMALL: 'PIENI',
'RANK.EQ': 'RANK.EQ',
RANK: 'RANK',
PERCENTILE: 'PROSENTTIPISTE',
'PERCENTILE.INC': 'PROSENTTIPISTE.SIS',
'PERCENTILE.EXC': 'PROSENTTIPISTE.ULK',
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/frFR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ const dictionary: RawTranslationPackage = {
IMTAN: 'COMPLEXE.TAN',
LARGE: 'GRANDE.VALEUR',
SMALL: 'PETITE.VALEUR',
'RANK.EQ': 'EQUATION.RANG',
RANK: 'RANG',
PERCENTILE: 'CENTILE',
'PERCENTILE.INC': 'CENTILE.INCLURE',
'PERCENTILE.EXC': 'CENTILE.EXCLURE',
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/huHU.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ const dictionary: RawTranslationPackage = {
IMTAN: 'K脡PZ.TAN',
LARGE: 'NAGY',
SMALL: 'KICSI',
'RANK.EQ': 'RANK.EQ',
RANK: 'RANK',
PERCENTILE: 'PERCENTILIS',
'PERCENTILE.INC': 'PERCENTILIS.TARTALMAZ',
'PERCENTILE.EXC': 'PERCENTILIS.KIZ脕R',
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/idID.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ const dictionary: RawTranslationPackage = {
IMTAN: 'IMTAN',
LARGE: 'BESAR',
SMALL: 'KECIL',
'RANK.EQ': 'RANK.EQ',
RANK: 'RANK',
PERCENTILE: 'PERCENTILE',
'PERCENTILE.INC': 'PERCENTILE.INC',
'PERCENTILE.EXC': 'PERCENTILE.EXC',
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/itIT.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ const dictionary: RawTranslationPackage = {
IMTAN: 'COMP.TAN',
LARGE: 'GRANDE',
SMALL: 'PICCOLO',
'RANK.EQ': 'RANGO.UG',
RANK: 'RANGO',
PERCENTILE: 'PERCENTILE',
'PERCENTILE.INC': 'INC.PERCENTILE',
'PERCENTILE.EXC': 'ESC.PERCENTILE',
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/nbNO.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ const dictionary: RawTranslationPackage = {
IMTAN: 'IMTAN',
LARGE: 'N.ST脴RST',
SMALL: 'N.MINST',
'RANK.EQ': 'RANG.EKV',
RANK: 'RANG',
PERCENTILE: 'PERSENTIL',
'PERCENTILE.INC': 'PERSENTIL.INK',
'PERCENTILE.EXC': 'PERSENTIL.EKS',
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/nlNL.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ const dictionary: RawTranslationPackage = {
IMTAN: 'C.TAN',
LARGE: 'GROOTSTE',
SMALL: 'KLEINSTE',
'RANK.EQ': 'RANG.GELIJK',
RANK: 'RANG',
PERCENTILE: 'PERCENTIEL',
'PERCENTILE.INC': 'PERCENTIEL.INC',
'PERCENTILE.EXC': 'PERCENTIEL.EXC',
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/plPL.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ const dictionary: RawTranslationPackage = {
IMTAN: 'TAN.LICZBY.ZESP',
LARGE: 'MAX.K',
SMALL: 'MIN.K',
'RANK.EQ': 'POZYCJA.NAJW',
RANK: 'POZYCJA',
PERCENTILE: 'PERCENTYL',
'PERCENTILE.INC': 'PERCENTYL.PRZEDZ.ZAMK',
'PERCENTILE.EXC': 'PERCENTYL.PRZEDZ.OTW',
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/ptPT.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ const dictionary: RawTranslationPackage = {
IMTAN: 'IMTAN',
LARGE: 'MAIOR',
SMALL: 'MENOR',
'RANK.EQ': 'ORDEM.EQ',
RANK: 'ORDEM',
PERCENTILE: 'PERCENTIL',
'PERCENTILE.INC': 'PERCENTIL.INC',
'PERCENTILE.EXC': 'PERCENTIL.EXC',
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/ruRU.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ const dictionary: RawTranslationPackage = {
IMTAN: '袦袧袠袦.TAN',
LARGE: '袧袗袠袘袨袥鞋楔袠袡',
SMALL: '袧袗袠袦袝袧鞋楔袠袡',
'RANK.EQ': '袪袗袧袚.袪袙',
RANK: '袪袗袧袚',
PERCENTILE: '袩袝袪小袝袧孝袠袥鞋',
'PERCENTILE.INC': '袩袪袨笑袝袧孝袠袥鞋.袙袣袥',
'PERCENTILE.EXC': '袩袪袨笑袝袧孝袠袥鞋.袠小袣袥',
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/svSE.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ const dictionary: RawTranslationPackage = {
IMTAN: 'IMTAN',
LARGE: 'ST脰RSTA',
SMALL: 'MINSTA',
'RANK.EQ': 'RANG.EKV',
RANK: 'RANG',
PERCENTILE: 'PERCENTIL',
'PERCENTILE.INC': 'PERCENTIL.INK',
'PERCENTILE.EXC': 'PERCENTIL.EXK',
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/languages/trTR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,8 @@ const dictionary: RawTranslationPackage = {
IMTAN: 'SANTAN',
LARGE: 'B脺Y脺K',
SMALL: 'K脺脟脺K',
'RANK.EQ': 'RANK.EQ',
RANK: 'RANK',
PERCENTILE: 'Y脺ZDEB陌RL陌K',
'PERCENTILE.INC': 'Y脺ZDEB陌RL陌K.DHL',
'PERCENTILE.EXC': 'Y脺ZDEB陌RL陌K.HRC',
Expand Down
7 changes: 7 additions & 0 deletions src/interpreter/functionMetadata/categories/statistical.ts
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,13 @@ export const STATISTICAL_DOCS: Record<string, FunctionDoc> = {
documentationUrl: 'https://hyperformula.handsontable.com/docs/guide/built-in-functions.html',
examples: ['=QUARTILE.INC(A1:A10, 3)'],
},
'RANK.EQ': {
category: 'Statistical',
shortDescription: 'Returns the rank of a number in a range; tied numbers share the top rank.',
parameters: [{name: 'number', description: 'The number whose rank to find.'}, {name: 'ref', description: 'The range of numbers to rank against; non-numeric cells are ignored.'}, {name: 'order', description: 'Optional. 0 or omitted ranks in descending order; any other value ranks in ascending order.'}],
documentationUrl: 'https://hyperformula.handsontable.com/docs/guide/built-in-functions.html',
examples: ['=RANK.EQ(A1, A1:A10)', '=RANK.EQ(A1, A1:A10, 1)'],
},
RSQ: {
category: 'Statistical',
shortDescription: 'Returns the squared correlation coefficient between two data sets.',
Expand Down
38 changes: 38 additions & 0 deletions src/interpreter/plugin/MedianPlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,18 @@ export class MedianPlugin extends FunctionPlugin implements FunctionPluginTypech
{argumentType: FunctionArgumentType.NUMBER, minValue: 1},
],
},
'RANK.EQ': {
method: 'rankEq',
parameters: [
{argumentType: FunctionArgumentType.NUMBER},
{argumentType: FunctionArgumentType.RANGE},
{argumentType: FunctionArgumentType.NUMBER, defaultValue: 0},
],
},
}

public static aliases = {
RANK: 'RANK.EQ',
}

/**
Expand Down Expand Up @@ -100,4 +112,30 @@ export class MedianPlugin extends FunctionPlugin implements FunctionPluginTypech
}
)
}

/**
* Corresponds to RANK.EQ(number, ref, [order]) and RANK(number, ref, [order]).
*
* Returns the rank of a number within a range; tied numbers share the top rank of the group.
* Order 0 (default) ranks descending, any other value ranks ascending. Only numeric cells of `ref` are considered.
*
* @param ast - procedure AST node
* @param state - interpreter state
*/
public rankEq(ast: ProcedureAst, state: InterpreterState): InterpreterValue {
return this.runFunction(ast.args, state, this.metadata('RANK.EQ'),
(target: number, range: SimpleRangeValue, order: number) => {
const numbers = this.arithmeticHelper.manyToExactNumbers(range.valuesFromTopLeftCorner())
if (numbers instanceof CellError) {
return numbers
}
if (!numbers.includes(target)) {
return new CellError(ErrorType.NA, ErrorMessage.ValueNotFound)
}
const isAscending = order !== 0
const better = numbers.filter(value => isAscending ? value < target : value > target)
return better.length + 1
Comment thread
cursor[bot] marked this conversation as resolved.
}
)
}
}
2 changes: 1 addition & 1 deletion src/license/functionCapabilities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ const UNGROUPED_FUNCTIONS = [
'ISREF', 'LCM', 'LOG10', 'LOGNORM.DIST', 'LOGNORM.INV', 'MAXA', 'MAXPOOL', 'MEDIANPOOL', 'MINA', 'MIRR',
'MMULT', 'MULTINOMIAL', 'NEGBINOM.DIST', 'NETWORKDAYS.INTL', 'NOMINAL', 'NORM.DIST', 'NORM.INV',
'NORM.S.DIST', 'NORM.S.INV', 'NPER', 'OCT2BIN', 'OCT2DEC', 'OCT2HEX', 'PDURATION', 'PERCENTILE.EXC',
'PHI', 'POISSON.DIST', 'QUARTILE.EXC', 'QUARTILE.INC', 'RADIANS', 'ROMAN', 'RRI', 'RSQ', 'SEC', 'SECH',
'PHI', 'POISSON.DIST', 'QUARTILE.EXC', 'QUARTILE.INC', 'RADIANS', 'RANK', 'RANK.EQ', 'ROMAN', 'RRI', 'RSQ', 'SEC', 'SECH',
'SERIESSUM', 'SHEET', 'SHEETS', 'SINH', 'SKEW', 'SKEW.P', 'SLOPE', 'SPLIT', 'SQRTPI', 'STANDARDIZE',
'STEYX', 'SUMX2MY2', 'SUMX2PY2', 'SYD', 'T.DIST', 'T.DIST.2T', 'T.DIST.RT', 'T.INV', 'T.INV.2T', 'T.TEST',
'TANH', 'TBILLEQ', 'TBILLPRICE', 'TBILLYIELD', 'TDIST', 'TIMEVALUE', 'UNICODE', 'VARA', 'VARPA',
Expand Down
Loading