mirror of
https://gitlab.com/bramw/baserow.git
synced 2025-04-26 13:44:41 +00:00
Merge branch '1940-add-split_part-formula-function' into 'develop'
Resolve "Add split_part formula function" Closes #1940 See merge request baserow/baserow!1646
This commit is contained in:
commit
f9772b12ac
7 changed files with 88 additions and 0 deletions
backend
src/baserow/contrib/database/formula/ast
tests/baserow/contrib/database/formula
changelog/entries/unreleased/feature
web-frontend
locales
modules/database
test/unit/database/formula
|
@ -151,6 +151,7 @@ def register_formula_functions(registry):
|
||||||
registry.register(BaserowEven())
|
registry.register(BaserowEven())
|
||||||
registry.register(BaserowOdd())
|
registry.register(BaserowOdd())
|
||||||
registry.register(BaserowTrunc())
|
registry.register(BaserowTrunc())
|
||||||
|
registry.register(BaserowSplitPart())
|
||||||
registry.register(BaserowLn())
|
registry.register(BaserowLn())
|
||||||
registry.register(BaserowExp())
|
registry.register(BaserowExp())
|
||||||
registry.register(BaserowLog())
|
registry.register(BaserowLog())
|
||||||
|
@ -854,6 +855,50 @@ class BaserowFloor(OneArgumentBaserowFunction):
|
||||||
return Floor(arg, output_field=int_like_numeric_output_field())
|
return Floor(arg, output_field=int_like_numeric_output_field())
|
||||||
|
|
||||||
|
|
||||||
|
class BaserowSplitPart(ThreeArgumentBaserowFunction):
|
||||||
|
type = "split_part"
|
||||||
|
arg1_type = [BaserowFormulaTextType]
|
||||||
|
arg2_type = [BaserowFormulaTextType]
|
||||||
|
arg3_type = [BaserowFormulaNumberType]
|
||||||
|
|
||||||
|
def type_function(
|
||||||
|
self,
|
||||||
|
func_call: BaserowFunctionCall[UnTyped],
|
||||||
|
arg1: BaserowExpression[BaserowFormulaTextType],
|
||||||
|
arg2: BaserowExpression[BaserowFormulaTextType],
|
||||||
|
arg3: BaserowExpression[BaserowFormulaNumberType],
|
||||||
|
) -> BaserowExpression[BaserowFormulaType]:
|
||||||
|
return func_call.with_valid_type(
|
||||||
|
BaserowFormulaTextType(
|
||||||
|
nullable=arg1.expression_type.nullable
|
||||||
|
or arg2.expression_type.nullable
|
||||||
|
or arg3.expression_type.nullable
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def to_django_expression(
|
||||||
|
self, arg1: Expression, arg2: Expression, arg3: Expression
|
||||||
|
) -> Expression:
|
||||||
|
return Case(
|
||||||
|
When(
|
||||||
|
condition=(
|
||||||
|
LessThanEqualOrExpr(
|
||||||
|
arg3, Value(0), output_field=fields.BooleanField()
|
||||||
|
)
|
||||||
|
),
|
||||||
|
then=Value(""),
|
||||||
|
),
|
||||||
|
default=Func(
|
||||||
|
arg1,
|
||||||
|
arg2,
|
||||||
|
trunc_numeric_to_int(arg3),
|
||||||
|
function="SPLIT_PART",
|
||||||
|
output_field=fields.CharField(),
|
||||||
|
),
|
||||||
|
output_field=fields.CharField(),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class BaserowTrunc(OneArgumentBaserowFunction):
|
class BaserowTrunc(OneArgumentBaserowFunction):
|
||||||
type = "trunc"
|
type = "trunc"
|
||||||
arg_type = [BaserowFormulaNumberType]
|
arg_type = [BaserowFormulaNumberType]
|
||||||
|
|
|
@ -358,6 +358,15 @@ VALID_FORMULA_TESTS = [
|
||||||
"http://example.com/wiki/Se%c3%b1or",
|
"http://example.com/wiki/Se%c3%b1or",
|
||||||
),
|
),
|
||||||
("encode_uri_component('Hello World')", "Hello%20World"),
|
("encode_uri_component('Hello World')", "Hello%20World"),
|
||||||
|
("split_part('John, Jane, Matthew', ', ', 2)", "Jane"),
|
||||||
|
("split_part('John, Jane, Matthew', 'xxx', 2)", ""),
|
||||||
|
("split_part('John, Jane, Matthew', ', ', -1.5)", ""),
|
||||||
|
("split_part('John, Jane, Matthew', ', ', -1)", ""),
|
||||||
|
("split_part('John, Jane, Matthew', ', ', 0)", ""),
|
||||||
|
("split_part('John, Jane, Matthew', ', ', 1.5)", "John"),
|
||||||
|
("split_part('John, Jane, Matthew', ', ', 3.5)", "Matthew"),
|
||||||
|
("split_part('John, Jane, Matthew', ', ', 4.5)", ""),
|
||||||
|
("split_part('John, Jane, Matthew', ', ', 9999)", ""),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"type": "feature",
|
||||||
|
"message": "add split_part formula function",
|
||||||
|
"issue_number": 1940,
|
||||||
|
"bullet_points": [],
|
||||||
|
"created_at": "2023-09-12"
|
||||||
|
}
|
|
@ -337,6 +337,7 @@
|
||||||
"formulaFunctions": {
|
"formulaFunctions": {
|
||||||
"upperDescription": "Returns its argument in upper case.",
|
"upperDescription": "Returns its argument in upper case.",
|
||||||
"lowerDescription": "Returns its argument in lower case.",
|
"lowerDescription": "Returns its argument in lower case.",
|
||||||
|
"splitPartDescription": "Extracts a segment from a delimited string based on a delimiter and index (numeric indicator indicating which element from string should be returned)",
|
||||||
"concatDescription": "Returns its arguments joined together as a single piece of text.",
|
"concatDescription": "Returns its arguments joined together as a single piece of text.",
|
||||||
"addDescription": "Returns its two arguments added together.",
|
"addDescription": "Returns its two arguments added together.",
|
||||||
"minusDescription": "Returns its two arguments subtracted.",
|
"minusDescription": "Returns its two arguments subtracted.",
|
||||||
|
|
|
@ -86,6 +86,29 @@ export class BaserowLower extends BaserowFunctionDefinition {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class BaserowSplitPart extends BaserowFunctionDefinition {
|
||||||
|
static getType() {
|
||||||
|
return 'split_part'
|
||||||
|
}
|
||||||
|
|
||||||
|
getDescription() {
|
||||||
|
const { i18n } = this.app
|
||||||
|
return i18n.t('formulaFunctions.splitPartDescription')
|
||||||
|
}
|
||||||
|
|
||||||
|
getSyntaxUsage() {
|
||||||
|
return ['split_part(text, delimiter, position)']
|
||||||
|
}
|
||||||
|
|
||||||
|
getExamples() {
|
||||||
|
return ["split_part('John, Jane, Michael', ', ', 2) = 'Jane'"]
|
||||||
|
}
|
||||||
|
|
||||||
|
getFormulaType() {
|
||||||
|
return 'text'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class BaserowConcat extends BaserowFunctionDefinition {
|
export class BaserowConcat extends BaserowFunctionDefinition {
|
||||||
static getType() {
|
static getType() {
|
||||||
return 'concat'
|
return 'concat'
|
||||||
|
|
|
@ -130,6 +130,7 @@ import {
|
||||||
BaserowLessThan,
|
BaserowLessThan,
|
||||||
BaserowLessThanOrEqual,
|
BaserowLessThanOrEqual,
|
||||||
BaserowLower,
|
BaserowLower,
|
||||||
|
BaserowSplitPart,
|
||||||
BaserowMinus,
|
BaserowMinus,
|
||||||
BaserowMultiply,
|
BaserowMultiply,
|
||||||
BaserowNot,
|
BaserowNot,
|
||||||
|
@ -462,6 +463,7 @@ export default (context) => {
|
||||||
'formula_function',
|
'formula_function',
|
||||||
new BaserowEncodeUriComponent(context)
|
new BaserowEncodeUriComponent(context)
|
||||||
)
|
)
|
||||||
|
app.$registry.register('formula_function', new BaserowSplitPart(context))
|
||||||
// Number functions
|
// Number functions
|
||||||
app.$registry.register('formula_function', new BaserowMultiply(context))
|
app.$registry.register('formula_function', new BaserowMultiply(context))
|
||||||
app.$registry.register('formula_function', new BaserowDivide(context))
|
app.$registry.register('formula_function', new BaserowDivide(context))
|
||||||
|
|
|
@ -93,6 +93,7 @@ describe('Formula Functions Test', () => {
|
||||||
'button',
|
'button',
|
||||||
'get_link_label',
|
'get_link_label',
|
||||||
'get_link_url',
|
'get_link_url',
|
||||||
|
'split_part',
|
||||||
]
|
]
|
||||||
const frontendFunctionTypes = Object.keys(
|
const frontendFunctionTypes = Object.keys(
|
||||||
testApp.store.$registry.getAll('formula_function')
|
testApp.store.$registry.getAll('formula_function')
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue