Data model
Sample Schema 

type UserPoint @TreeIndexRoot(index:"USER_INDEX"){
id: ID!
creation_ts: Timestamp! @TreeIndex(index:"USER_INDEX")
creation_date:Date! @Function(name:"ISODate", params:["creation_ts"])
# User identifiers
accounts: [UserAccount!]!
emails: [UserEmail!]!
devices: [UserDevicePoint!]!
# User content
activities: [UserActivity!]!
events: [UserEvent!]!
profiles: [UserProfile!]!
choices: [UserChoice!]!
# Technical objects
scenarios: [UserScenario!]!
segments: [UserSegment!]!
# Deprecated identifiers
# agents: [UserAgent!]!
}
### User identifiers
type UserAccount {
id:ID! @TreeIndex(index:"USER_INDEX")
creation_ts: Timestamp! @TreeIndex(index:"USER_INDEX")
creation_date:Date! @TreeIndex(index:"USER_INDEX") @Function(params:["creation_ts"], name:"ISODate")
compartment_id: String! @TreeIndex(index:"USER_INDEX") @ReferenceTable(model_type:"COMPARTMENTS", type:"CORE_OBJECT")
user_account_id: String! @TreeIndex(index:"USER_INDEX")
}
type UserEmail {
id:ID! @TreeIndex(index:"USER_INDEX")
creation_ts: Timestamp! @TreeIndex(index:"USER_INDEX")
last_activity_ts: Timestamp @TreeIndex(index:"USER_INDEX")
email: String @TreeIndex(index:"USER_INDEX")
}
type UserDevicePoint {
id:ID! @TreeIndex(index:"USER_INDEX")
creation_ts:Timestamp! @TreeIndex(index:"USER_INDEX")
creation_date:Date! @Function(name:"ISODate", params:["creation_ts"])
device_info:DeviceInfo
technical_identifiers:[UserDeviceTechnicalId!]!
mappings:[UserAgentMapping!]! @Function(name:"ThirdPartyCookieMappings", params:["id"])
}
type DeviceInfo {
brand:String @TreeIndex(index:"USER_INDEX")
browser_version:String @TreeIndex(index:"USER_INDEX")
carrier:String @TreeIndex(index:"USER_INDEX")
model:String @TreeIndex(index:"USER_INDEX")
os_version:String @TreeIndex(index:"USER_INDEX")
agent_type:UserAgentType @TreeIndex(index:"USER_INDEX")
browser_family:BrowserFamily @TreeIndex(index:"USER_INDEX")
form_factor:FormFactor @TreeIndex(index:"USER_INDEX")
os_family:OperatingSystemFamily @TreeIndex(index:"USER_INDEX")
}
type UserDeviceTechnicalId {
id:ID! @TreeIndex(index:"USER_INDEX")
creation_ts:Timestamp! @TreeIndex(index:"USER_INDEX")
expiration_ts:Timestamp! @TreeIndex(index:"USER_INDEX")
last_seen_ts:Timestamp! @TreeIndex(index:"USER_INDEX")
registry_id:String! @TreeIndex(index:"USER_INDEX")
type:String! @TreeIndex(index:"USER_INDEX")
}
type UserAgentMapping {
last_seen:Timestamp
user_agent_id:String @TreeIndex(index:"USER_INDEX")
vector_id:String
}
### User content
type UserActivity {
id: ID!
type: UserActivityType!
channel_id:String @TreeIndex(index:"USER_INDEX") @ReferenceTable(type:"CORE_OBJECT", model_type:"CHANNELS") @Property(paths:["$site_id", "$app_id"])
source: UserActivitySource!
ts: Timestamp! @TreeIndex(index:"USER_INDEX")
duration: Int @TreeIndex(index:"USER_INDEX")
events: [UserEvent!]!
}
type UserEvent @Mirror(object_type:"UserEvent") {
id: ID!
ts: Timestamp! @TreeIndex(index:"USER_INDEX")
date:Date! @Function(params:["ts"], name:"ISODate")
name:String! @TreeIndex(index:"USER_INDEX")
channel_id:String @TreeIndex(index:"USER_INDEX") @ReferenceTable(model_type:"CHANNELS", type:"CORE_OBJECT") @Property(paths:["[parent].$site_id", "[parent].$app_id"])
url: String @TreeIndex(index:"USER_INDEX")
referrer:String @TreeIndex(index:"USER_INDEX")
}
type UserProfile {
id: ID!
creation_ts: Timestamp! @TreeIndex(index:"USER_INDEX")
last_modified_ts: Timestamp! @TreeIndex(index:"USER_INDEX")
compartment_id: String! @TreeIndex(index:"USER_INDEX") @ReferenceTable(model_type:"COMPARTMENTS", type:"CORE_OBJECT")
user_account_id: String @TreeIndex(index:"USER_INDEX")
}
type UserChoice {
id: ID!
creation_ts: Timestamp! @TreeIndex(index:"USER_INDEX")
choice_ts: Timestamp! @TreeIndex(index:"USER_INDEX")
processing_id: String! @TreeIndex(index:"USER_INDEX")
choice_acceptance_value: Boolean! @TreeIndex(index:"USER_INDEX")
user_account_id: String
compartment_id: String
email_hash: String
user_agent_id: String
channel_id: String
}
### Technical objects
type UserSegment {
id: ID! @TreeIndex(index:"USER_INDEX") @ReferenceTable(model_type:"SEGMENTS", type:"CORE_OBJECT")
creation_ts: Timestamp! @TreeIndex(index:"USER_INDEX")
last_modified_ts: Timestamp! @TreeIndex(index:"USER_INDEX")
expiration_ts: Timestamp @TreeIndex(index:"USER_INDEX")
}
type UserScenario {
id: ID! @TreeIndex(index:"USER_INDEX")
scenario_id: String! @TreeIndex(index:"USER_INDEX")
execution_id: String! @TreeIndex(index:"USER_INDEX")
node_id: String! @TreeIndex(index:"USER_INDEX")
callback_ts: Timestamp @TreeIndex(index:"USER_INDEX")
start_ts: Timestamp! @TreeIndex(index:"USER_INDEX")
node_start_ts: Timestamp! @TreeIndex(index:"USER_INDEX")
active: Boolean @TreeIndex(index:"USER_INDEX")
}
### Deprecated identifiers
# type UserAgent {
# id:ID!
# creation_ts: Timestamp!
# last_activity_ts: Timestamp
# user_agent_info:UserAgentInfo @Function(name:"DeviceInfo", params:["id"])
# }
# type UserAgentInfo {
# form_factor:FormFactor
# brand:String
# browser_family:BrowserFamily
# browser_version:String
# carrier:String
# model:String
# os_family:OperatingSystemFamily
# os_version:String
# agent_type:UserAgentType
# }Syntax highlights
The ! operator
! operatorThe ID type
ID typeBasic types
Timestamps and dates
Directives
@TreeIndexRoot
@TreeIndex
String indexed as text
textString indexed as keyword
keyword@Property
Taking value from multiple paths
Available tokens
@Mirror
Sample usage: custom types with filters
@Function
ISODate
ThirdPartyCookieMappings
DeviceInfo (legacy)
@ReferenceTable
@EdgeAvailability
@ComputedField
@UpdateStrategyKey
@UpdateValueObject
Best practices
Do not index ISODate function result
UserEvent indexed twice
Last updated
Was this helpful?