Arithmetic Operations
HelixQL provides six fundamental arithmetic functions for performing basic mathematical calculations in your queries.
Available Functions
ADD - Addition
ADD ( a , b ) // Returns a + b
SUB - Subtraction
SUB ( a , b ) // Returns a - b
MUL - Multiplication
MUL ( a , b ) // Returns a * b
DIV - Division
DIV ( a , b ) // Returns a / b
POW - Power
POW ( base , exponent ) // Returns base^exponent
MOD - Modulo
MOD ( a , b ) // Returns a % b (remainder)
When using the SDKs or curling the endpoint, the query name must match what is defined in the queries.hx file exactly.
Example 1: Basic arithmetic in property calculations
Calculate discounted prices and tax for products:
QUERY CalculateProductPricing ( discount_percent : F64 , tax_rate : F64 ) =>
products <- N :: Product
:: {
name ,
original_price : price ,
discount : MUL ( _ :: { price }, DIV ( discount_percent , 100.0 )),
final_price : SUB ( _ :: { price }, MUL ( _ :: { price }, DIV ( discount_percent , 100.0 ))),
with_tax : MUL ( SUB ( _ :: { price }, MUL ( _ :: { price }, DIV ( discount_percent , 100.0 ))), ADD ( 1.0 , tax_rate ))
}
RETURN products
QUERY InsertProduct ( name : String , price : F64 ) =>
product <- AddN < Product >({ name : name , price : price })
RETURN product
Here’s how to run the query using the SDKs or curl
Python
Rust
Go
TypeScript
Curl
from helix.client import Client
client = Client( local = True , port = 6969 )
# Insert sample products
products = [
{ "name" : "Laptop" , "price" : 999.99 },
{ "name" : "Mouse" , "price" : 29.99 },
{ "name" : "Keyboard" , "price" : 79.99 },
]
for product in products:
client.query( "InsertProduct" , product)
# Calculate pricing with 15% discount and 8.5% tax
result = client.query( "CalculateProductPricing" , {
"discount_percent" : 15.0 ,
"tax_rate" : 0.085
})
print ( "Product pricing:" , result)
See all 21 lines
Example 2: Using POW for exponential calculations
Calculate compound interest over time:
QUERY CalculateInvestmentGrowth ( years : I32 , rate : F64 ) =>
accounts <- N :: Account
:: {
account_id ,
initial_amount ,
final_amount : MUL ( _ :: { initial_amount }, POW ( ADD ( 1.0 , rate ), years ))
}
RETURN accounts
QUERY CreateAccount ( account_id : String , initial_amount : F64 ) =>
account <- AddN < Account >({ account_id : account_id , initial_amount : initial_amount })
RETURN account
Here’s how to run the query using the SDKs or curl
Python
Rust
Go
TypeScript
Curl
from helix.client import Client
client = Client( local = True , port = 6969 )
# Create accounts
accounts = [
{ "account_id" : "ACC001" , "initial_amount" : 10000.0 },
{ "account_id" : "ACC002" , "initial_amount" : 25000.0 },
{ "account_id" : "ACC003" , "initial_amount" : 50000.0 },
]
for account in accounts:
client.query( "CreateAccount" , account)
# Calculate growth over 10 years at 7% annual rate
result = client.query( "CalculateInvestmentGrowth" , {
"years" : 10 ,
"rate" : 0.07
})
print ( "Investment growth:" , result)
See all 21 lines
Example 3: Using MOD for cyclic patterns
Use modulo to determine recurring patterns or groupings:
QUERY CategorizeByRotation ( group_size : I64 ) =>
items <- N :: Item
:: {
item_id ,
position ,
group : MOD ( _ :: { position }, group_size ),
is_first_in_group : MOD ( _ :: { position }, group_size ) :: EQ ( 0 )
}
RETURN items
QUERY CreateItem ( item_id : String , position : I64 ) =>
item <- AddN < Item >({ item_id : item_id , position : position })
RETURN item
Here’s how to run the query using the SDKs or curl
Python
Rust
Go
TypeScript
Curl
from helix.client import Client
client = Client( local = True , port = 6969 )
# Create items with positions
for i in range ( 15 ):
client.query( "CreateItem" , {
"item_id" : f "ITEM { i :03d} " ,
"position" : i
})
# Categorize into groups of 5
result = client.query( "CategorizeByRotation" , {
"group_size" : 5
})
print ( "Categorized items:" , result)
See all 17 lines
Function Composition
Arithmetic functions can be nested to create complex calculations:
// Multi-factor scoring
ADD (
MUL ( _ :: { base_score }, 0.6 ),
MUL ( _ :: { bonus_score }, 0.4 )
)
// Percentage calculation
MUL ( DIV ( _ :: { partial }, _ :: { total }), 100.0 )
// Exponential decay
MUL ( _ :: { initial_value }, POW ( 0.9 , _ :: { time_elapsed }))
Use in Shortest Path Weights
Arithmetic functions are commonly used in custom weight calculations:
// Distance-based weight with decay
:: ShortestPathDijkstras < Route >(
MUL ( _ :: { distance }, POW ( 0.95 , DIV ( _ :: { days_old }, 30 )))
)
// Multi-factor routing cost
:: ShortestPathDijkstras < Road >(
ADD (
MUL ( _ :: { distance }, 0.7 ),
MUL ( _ :: { toll_cost }, 0.3 )
)
)