<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 -->
<h2 id="virtual-properties" class="position-relative d-flex align-items-center group">
<span>Virtual Properties</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="virtual-properties"
aria-haspopup="dialog"
aria-label="Share link: Virtual Properties">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h2><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden>
<div class="hsm-dialog" role="document">
<div class="hsm-header">
<h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2>
<button type="button" class="hsm-close" aria-label="Close">
<i class="fa-solid fa-xmark"></i>
</button>
</div>
<div class="hsm-body">
<label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label>
<div class="input-group mb-4 hsm-url-group">
<input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" />
<button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy">
<i class="fa-duotone fa-clipboard" aria-hidden="true"></i>
</button>
</div>
<div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div>
<div class="hsm-share-grid">
<a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-twitter me-2"></i>Twitter
</a>
<a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-linkedin me-2"></i>LinkedIn
</a>
<a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-facebook me-2"></i>Facebook
</a>
</div>
</div>
</div>
</div>
<style>
.heading-share-modal {
position: fixed;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0.6);
z-index: 1050;
padding: 1rem;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
.heading-share-modal[hidden] { display: none !important; }
.hsm-dialog {
max-width: 420px;
width: 100%;
background: var(--bs-body-bg, #fff);
color: var(--bs-body-color, #212529);
border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
border-radius: 1rem;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
overflow: hidden;
animation: hsm-fade-in 0.2s ease-out;
}
@keyframes hsm-fade-in {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }
}
[data-bs-theme="dark"] .hsm-dialog {
background: #1e293b;
border-color: rgba(255,255,255,0.1);
color: #f8f9fa;
}
.hsm-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 1.5rem;
border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
background: rgba(0,0,0,0.02);
}
[data-bs-theme="dark"] .hsm-header {
background: rgba(255,255,255,0.02);
border-color: rgba(255,255,255,0.1);
}
.hsm-close {
background: transparent;
border: none;
color: inherit;
opacity: 0.5;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-size: 1.2rem;
line-height: 1;
transition: opacity 0.2s;
}
.hsm-close:hover {
opacity: 1;
}
.hsm-body {
padding: 1.5rem;
}
.hsm-url-group {
display: flex !important;
align-items: stretch;
}
.hsm-url-group .form-control {
flex: 1;
min-width: 0;
margin: 0;
background: var(--bs-secondary-bg, #f8f9fa);
border-color: var(--bs-border-color, #dee2e6);
border-top-right-radius: 0;
border-bottom-right-radius: 0;
height: 42px;
}
.hsm-url-group .btn {
flex: 0 0 auto;
margin: 0;
margin-left: -1px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 1.25rem;
z-index: 2;
}
[data-bs-theme="dark"] .hsm-url-group .form-control {
background: #0f172a;
border-color: #334155;
color: #e2e8f0;
}
.hsm-share-grid {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.hsm-share-grid .btn {
display: flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
padding: 0.6rem;
border-color: var(--bs-border-color);
width: 100%;
}
[data-bs-theme="dark"] .hsm-share-grid .btn {
color: #e2e8f0;
border-color: #475569;
}
[data-bs-theme="dark"] .hsm-share-grid .btn:hover {
background: #334155;
border-color: #cbd5e1;
}
</style>
<script>
(function(){
const modal = document.getElementById('headingShareModal');
if(!modal) return;
const input = modal.querySelector('#headingShareInput');
const copyBtn = modal.querySelector('.hsm-copy');
const twitter = modal.querySelector('#share-twitter');
const linkedin = modal.querySelector('#share-linkedin');
const facebook = modal.querySelector('#share-facebook');
const closeBtn = modal.querySelector('.hsm-close');
let lastFocus=null;
let trapBound=false;
function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; }
function isOpen(){ return !modal.hasAttribute('hidden'); }
function hydrate(id){
const url=buildUrl(id);
input.value=url;
const enc=encodeURIComponent(url);
const text=encodeURIComponent(document.title);
if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`;
if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`;
if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`;
}
function openModal(id){
lastFocus=document.activeElement;
hydrate(id);
if(!isOpen()){
modal.removeAttribute('hidden');
}
requestAnimationFrame(()=>{ input.focus(); });
trapFocus();
}
function closeModal(){
if(!isOpen()) return;
modal.setAttribute('hidden','');
if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus();
}
function copyCurrent(){
try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); }
catch(e){ fallback(); }
}
function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} }
function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); }
function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); }
function bindShareButtons(){
document.querySelectorAll('.h-share').forEach(btn=>{
if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; }
});
}
bindShareButtons();
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', bindShareButtons);
} else {
requestAnimationFrame(bindShareButtons);
}
document.addEventListener('click', function(e){
const shareBtn=e.target.closest && e.target.closest('.h-share');
if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); }
}, true);
document.addEventListener('click', e=>{
if(e.target===modal) closeModal();
if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); }
if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); }
});
document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); });
function trapFocus(){
if(trapBound) return;
trapBound=true;
modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } });
}
if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); });
})();
</script><p>Virtual properties are calculated on-demand at query time and never persisted to storage. They provide dynamically computed values derived from stored properties, relationships, or external data sources without consuming disk space. Ideal for transient calculations, display formatting, and derived data that changes frequently or is rarely queried.</p>
<h3 id="understanding-virtual-properties" class="position-relative d-flex align-items-center group">
<span>Understanding Virtual Properties</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="understanding-virtual-properties"
aria-haspopup="dialog"
aria-label="Share link: Understanding Virtual Properties">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="what-are-virtual-properties" class="position-relative d-flex align-items-center group">
<span>What are Virtual Properties?</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="what-are-virtual-properties"
aria-haspopup="dialog"
aria-label="Share link: What are Virtual Properties?">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Virtual properties offer zero-storage computation:</p>
<p><strong>Never Stored</strong> - Calculated only when accessed, no disk persistence
<strong>Always Fresh</strong> - Reflect current state of underlying data
<strong>Zero Storage Cost</strong> - No disk space or memory overhead
<strong>Flexible</strong> - Easy to modify without data migration
<strong>Query-Time Evaluation</strong> - Computed during SELECT execution</p>
<h4 id="virtual-vs-computed-vs-stored-properties" class="position-relative d-flex align-items-center group">
<span>Virtual vs Computed vs Stored Properties</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="virtual-vs-computed-vs-stored-properties"
aria-haspopup="dialog"
aria-label="Share link: Virtual vs Computed vs Stored Properties">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><table>
<thead>
<tr>
<th>Aspect</th>
<th>Stored Property</th>
<th>Computed Property</th>
<th>Virtual Property</th>
</tr>
</thead>
<tbody>
<tr>
<td>Storage</td>
<td>Full persistence</td>
<td>Sometimes cached</td>
<td>Never stored</td>
</tr>
<tr>
<td>Calculation</td>
<td>Never</td>
<td>On write or read</td>
<td>Always on read</td>
</tr>
<tr>
<td>Read Performance</td>
<td>Fastest</td>
<td>Medium</td>
<td>Slowest</td>
</tr>
<tr>
<td>Write Performance</td>
<td>Fastest</td>
<td>Slower (compute)</td>
<td>N/A (no writes)</td>
</tr>
<tr>
<td>Data Freshness</td>
<td>May be stale</td>
<td>Always current</td>
<td>Always current</td>
</tr>
<tr>
<td>Disk Usage</td>
<td>High</td>
<td>Medium</td>
<td>Zero</td>
</tr>
<tr>
<td>Indexable</td>
<td>Yes</td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<td>Use Case</td>
<td>Core data</td>
<td>Frequently queried</td>
<td>Rarely queried</td>
</tr>
</tbody>
</table>
<h4 id="when-to-use-virtual-properties" class="position-relative d-flex align-items-center group">
<span>When to Use Virtual Properties</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="when-to-use-virtual-properties"
aria-haspopup="dialog"
aria-label="Share link: When to Use Virtual Properties">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Ideal For</strong>:</p>
<ul>
<li>Display formatting (phone numbers, dates, names)</li>
<li>Simple arithmetic transformations</li>
<li>Frequently changing business logic</li>
<li>Properties queried infrequently</li>
<li>Transient derived values</li>
<li>Presentation layer logic</li>
</ul>
<p><strong>Avoid When</strong>:</p>
<ul>
<li>Need to filter/sort by the property frequently</li>
<li>Complex expensive computations</li>
<li>Aggregations across many nodes</li>
<li>Need indexes for performance</li>
<li>Value used in WHERE clauses often</li>
</ul>
<h3 id="defining-virtual-properties" class="position-relative d-flex align-items-center group">
<span>Defining Virtual Properties</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="defining-virtual-properties"
aria-haspopup="dialog"
aria-label="Share link: Defining Virtual Properties">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="basic-virtual-properties" class="position-relative d-flex align-items-center group">
<span>Basic Virtual Properties</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="basic-virtual-properties"
aria-haspopup="dialog"
aria-label="Share link: Basic Virtual Properties">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="py">PROPERTY</span><span class="w"> </span><span class="py">TYPE</span><span class="w"> </span><span class="py">Person</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">first_name</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">last_name</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">birth_date</span><span class="w"> </span><span class="py">DATE</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">email</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Virtual</span><span class="w"> </span><span class="py">properties</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">display</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">full_name</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">first_name</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">last_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">display_name</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">first_name</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">last_name</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">first_name</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">last_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">first_name</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">first_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">last_name</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">last_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="err">'</span><span class="py">Anonymous</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">initials</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">UPPER</span><span class="p">(</span><span class="py">SUBSTRING</span><span class="p">(</span><span class="py">first_name</span><span class="p">,</span><span class="w"> </span><span class="py">1</span><span class="p">,</span><span class="w"> </span><span class="py">1</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">SUBSTRING</span><span class="p">(</span><span class="py">last_name</span><span class="p">,</span><span class="w"> </span><span class="py">1</span><span class="p">,</span><span class="w"> </span><span class="py">1</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Age</span><span class="w"> </span><span class="py">calculation</span><span class="w"> </span><span class="p">(</span><span class="py">always</span><span class="w"> </span><span class="py">current</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">age</span><span class="w"> </span><span class="py">INTEGER</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">YEAR</span><span class="p">,</span><span class="w"> </span><span class="py">birth_date</span><span class="p">,</span><span class="w"> </span><span class="py">CURRENT_DATE</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">is_adult</span><span class="w"> </span><span class="py">BOOLEAN</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">age</span><span class="w"> </span><span class="err">></span><span class="p">=</span><span class="w"> </span><span class="py">18</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Email</span><span class="w"> </span><span class="py">domain</span><span class="w"> </span><span class="py">extraction</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">email_domain</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SUBSTRING</span><span class="p">(</span><span class="py">email</span><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="py">POSITION</span><span class="p">(</span><span class="err">'@'</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="py">email</span><span class="p">)</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">1</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">email_username</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SUBSTRING</span><span class="p">(</span><span class="py">email</span><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">FOR</span><span class="w"> </span><span class="py">POSITION</span><span class="p">(</span><span class="err">'@'</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="py">email</span><span class="p">)</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">1</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="formatting-virtual-properties" class="position-relative d-flex align-items-center group">
<span>Formatting Virtual Properties</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="formatting-virtual-properties"
aria-haspopup="dialog"
aria-label="Share link: Formatting Virtual Properties">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="py">PROPERTY</span><span class="w"> </span><span class="py">TYPE</span><span class="w"> </span><span class="py">Contact</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">phone</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Stored</span><span class="w"> </span><span class="py">as</span><span class="w"> </span><span class="s">"1234567890"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">address_line1</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">address_line2</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">city</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">state</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">zip</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">country</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Phone</span><span class="w"> </span><span class="py">number</span><span class="w"> </span><span class="py">formatting</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">formatted_phone</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">LENGTH</span><span class="p">(</span><span class="py">phone</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">10</span><span class="w"> </span><span class="py">THEN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">'</span><span class="p">(</span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">SUBSTRING</span><span class="p">(</span><span class="py">phone</span><span class="p">,</span><span class="w"> </span><span class="py">1</span><span class="p">,</span><span class="w"> </span><span class="py">3</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="p">)</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SUBSTRING</span><span class="p">(</span><span class="py">phone</span><span class="p">,</span><span class="w"> </span><span class="py">4</span><span class="p">,</span><span class="w"> </span><span class="py">3</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'-'</span><span class="w"> </span><span class="p">||</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SUBSTRING</span><span class="p">(</span><span class="py">phone</span><span class="p">,</span><span class="w"> </span><span class="py">7</span><span class="p">,</span><span class="w"> </span><span class="py">4</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">LENGTH</span><span class="p">(</span><span class="py">phone</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">11</span><span class="w"> </span><span class="py">THEN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">'+'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">SUBSTRING</span><span class="p">(</span><span class="py">phone</span><span class="p">,</span><span class="w"> </span><span class="py">1</span><span class="p">,</span><span class="w"> </span><span class="py">1</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">(</span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SUBSTRING</span><span class="p">(</span><span class="py">phone</span><span class="p">,</span><span class="w"> </span><span class="py">2</span><span class="p">,</span><span class="w"> </span><span class="py">3</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="p">)</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SUBSTRING</span><span class="p">(</span><span class="py">phone</span><span class="p">,</span><span class="w"> </span><span class="py">5</span><span class="p">,</span><span class="w"> </span><span class="py">3</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'-'</span><span class="w"> </span><span class="p">||</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SUBSTRING</span><span class="p">(</span><span class="py">phone</span><span class="p">,</span><span class="w"> </span><span class="py">8</span><span class="p">,</span><span class="w"> </span><span class="py">4</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">phone</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Full</span><span class="w"> </span><span class="py">address</span><span class="w"> </span><span class="py">formatting</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">full_address</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">address_line1</span><span class="w"> </span><span class="p">||</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">address_line2</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">address_line2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="err">''</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w"> </span><span class="p">||</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">city</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">state</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">zip</span><span class="w"> </span><span class="p">||</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">country</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">country</span><span class="w"> </span><span class="err"><></span><span class="w"> </span><span class="err">'</span><span class="py">USA</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">country</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="err">''</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Short</span><span class="w"> </span><span class="py">address</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">display</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">short_address</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">city</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">state</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="relationship-based-virtual-properties" class="position-relative d-flex align-items-center group">
<span>Relationship-Based Virtual Properties</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="relationship-based-virtual-properties"
aria-haspopup="dialog"
aria-label="Share link: Relationship-Based Virtual Properties">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="py">PROPERTY</span><span class="w"> </span><span class="py">TYPE</span><span class="w"> </span><span class="py">User</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">id</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">created_at</span><span class="w"> </span><span class="py">TIMESTAMP</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Relationship</span><span class="w"> </span><span class="py">counts</span><span class="w"> </span><span class="p">(</span><span class="py">calculated</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">access</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">follower_count</span><span class="w"> </span><span class="py">INTEGER</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SELECT</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">this</span><span class="p">)</span><span class="err"><-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">follower</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">following_count</span><span class="w"> </span><span class="py">INTEGER</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SELECT</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">this</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">following</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">friend_count</span><span class="w"> </span><span class="py">INTEGER</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SELECT</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">this</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FRIEND</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">friend</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">post_count</span><span class="w"> </span><span class="py">INTEGER</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SELECT</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">this</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">POSTED</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">post</span><span class="p">:</span><span class="nc">Post</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Derived</span><span class="w"> </span><span class="py">metrics</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">follower_ratio</span><span class="w"> </span><span class="py">DECIMAL</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">follower_count</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">DECIMAL</span><span class="p">)</span><span class="w"> </span><span class="err">/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">NULLIF</span><span class="p">(</span><span class="py">following_count</span><span class="p">,</span><span class="w"> </span><span class="py">0</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">engagement_rate</span><span class="w"> </span><span class="py">DECIMAL</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">follower_count</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">post_count</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">10</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">DECIMAL</span><span class="p">)</span><span class="w"> </span><span class="err">/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">NULLIF</span><span class="p">(</span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">DAY</span><span class="p">,</span><span class="w"> </span><span class="py">created_at</span><span class="p">,</span><span class="w"> </span><span class="py">NOW</span><span class="p">()),</span><span class="w"> </span><span class="py">0</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">List</span><span class="w"> </span><span class="py">properties</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">follower_ids</span><span class="w"> </span><span class="py">LIST</span><span class="err"><</span><span class="py">STRING</span><span class="err">></span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SELECT</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">this</span><span class="p">)</span><span class="err"><-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">following_ids</span><span class="w"> </span><span class="py">LIST</span><span class="err"><</span><span class="py">STRING</span><span class="err">></span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SELECT</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">this</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Boolean</span><span class="w"> </span><span class="py">checks</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">has_followers</span><span class="w"> </span><span class="py">BOOLEAN</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="py">follower_count</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">0</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">is_following_anyone</span><span class="w"> </span><span class="py">BOOLEAN</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="py">following_count</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">0</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">is_active</span><span class="w"> </span><span class="py">BOOLEAN</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">post_count</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">AND</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">DAY</span><span class="p">,</span><span class="w"> </span><span class="py">created_at</span><span class="p">,</span><span class="w"> </span><span class="py">NOW</span><span class="p">())</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">30</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="time-based-virtual-properties" class="position-relative d-flex align-items-center group">
<span>Time-Based Virtual Properties</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="time-based-virtual-properties"
aria-haspopup="dialog"
aria-label="Share link: Time-Based Virtual Properties">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="py">PROPERTY</span><span class="w"> </span><span class="py">TYPE</span><span class="w"> </span><span class="py">Order</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">id</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">created_at</span><span class="w"> </span><span class="py">TIMESTAMP</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">updated_at</span><span class="w"> </span><span class="py">TIMESTAMP</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">shipped_at</span><span class="w"> </span><span class="py">TIMESTAMP</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">delivered_at</span><span class="w"> </span><span class="py">TIMESTAMP</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">status</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">total</span><span class="w"> </span><span class="py">DECIMAL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Time</span><span class="w"> </span><span class="py">since</span><span class="w"> </span><span class="py">events</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">days_since_created</span><span class="w"> </span><span class="py">INTEGER</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">DAY</span><span class="p">,</span><span class="w"> </span><span class="py">created_at</span><span class="p">,</span><span class="w"> </span><span class="py">NOW</span><span class="p">())</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">hours_since_updated</span><span class="w"> </span><span class="py">INTEGER</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">HOUR</span><span class="p">,</span><span class="w"> </span><span class="py">updated_at</span><span class="p">,</span><span class="w"> </span><span class="py">NOW</span><span class="p">())</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Time</span><span class="w"> </span><span class="py">periods</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">is_recent</span><span class="w"> </span><span class="py">BOOLEAN</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="py">days_since_created</span><span class="w"> </span><span class="err"><</span><span class="p">=</span><span class="w"> </span><span class="py">7</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">is_this_month</span><span class="w"> </span><span class="py">BOOLEAN</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">MONTH</span><span class="p">(</span><span class="py">created_at</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">MONTH</span><span class="p">(</span><span class="py">NOW</span><span class="p">())</span><span class="w"> </span><span class="py">AND</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">YEAR</span><span class="p">(</span><span class="py">created_at</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">YEAR</span><span class="p">(</span><span class="py">NOW</span><span class="p">())</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Processing</span><span class="w"> </span><span class="py">times</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">processing_time_hours</span><span class="w"> </span><span class="py">INTEGER</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">shipped_at</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">HOUR</span><span class="p">,</span><span class="w"> </span><span class="py">created_at</span><span class="p">,</span><span class="w"> </span><span class="py">shipped_at</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">delivery_time_hours</span><span class="w"> </span><span class="py">INTEGER</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">delivered_at</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">shipped_at</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">HOUR</span><span class="p">,</span><span class="w"> </span><span class="py">shipped_at</span><span class="p">,</span><span class="w"> </span><span class="py">delivered_at</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">total_time_hours</span><span class="w"> </span><span class="py">INTEGER</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">delivered_at</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">HOUR</span><span class="p">,</span><span class="w"> </span><span class="py">created_at</span><span class="p">,</span><span class="w"> </span><span class="py">delivered_at</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Order</span><span class="w"> </span><span class="py">age</span><span class="w"> </span><span class="py">category</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">age_category</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">days_since_created</span><span class="w"> </span><span class="err"><</span><span class="p">=</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">today</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">days_since_created</span><span class="w"> </span><span class="err"><</span><span class="p">=</span><span class="w"> </span><span class="py">7</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">this_week</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">days_since_created</span><span class="w"> </span><span class="err"><</span><span class="p">=</span><span class="w"> </span><span class="py">30</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">this_month</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">days_since_created</span><span class="w"> </span><span class="err"><</span><span class="p">=</span><span class="w"> </span><span class="py">90</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">recent</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">days_since_created</span><span class="w"> </span><span class="err"><</span><span class="p">=</span><span class="w"> </span><span class="py">365</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">this_year</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="err">'</span><span class="py">old</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Status</span><span class="w"> </span><span class="py">checks</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">is_pending</span><span class="w"> </span><span class="py">BOOLEAN</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="py">status</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="p">(</span><span class="err">'</span><span class="py">pending</span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="py">processing</span><span class="err">'</span><span class="p">)),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">is_completed</span><span class="w"> </span><span class="py">BOOLEAN</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="py">status</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">delivered</span><span class="err">'</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">is_overdue</span><span class="w"> </span><span class="py">BOOLEAN</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">status</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="p">(</span><span class="err">'</span><span class="py">pending</span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="py">processing</span><span class="err">'</span><span class="p">)</span><span class="w"> </span><span class="py">AND</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">days_since_created</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">7</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Price</span><span class="w"> </span><span class="py">categorization</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">price_tier</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">total</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">25</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">budget</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">total</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">100</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">standard</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">total</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">500</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">premium</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="err">'</span><span class="py">luxury</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="real-world-use-cases" class="position-relative d-flex align-items-center group">
<span>Real-World Use Cases</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="real-world-use-cases"
aria-haspopup="dialog"
aria-label="Share link: Real-World Use Cases">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="e-commerce-product-display" class="position-relative d-flex align-items-center group">
<span>E-Commerce Product Display</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="e-commerce-product-display"
aria-haspopup="dialog"
aria-label="Share link: E-Commerce Product Display">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="py">PROPERTY</span><span class="w"> </span><span class="py">TYPE</span><span class="w"> </span><span class="py">Product</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">base_price</span><span class="w"> </span><span class="py">DECIMAL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">discount_percentage</span><span class="w"> </span><span class="py">DECIMAL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">cost</span><span class="w"> </span><span class="py">DECIMAL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">stock_quantity</span><span class="w"> </span><span class="py">INTEGER</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">category</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">brand</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Pricing</span><span class="w"> </span><span class="py">display</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">discount_amount</span><span class="w"> </span><span class="py">DECIMAL</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">base_price</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">discount_percentage</span><span class="w"> </span><span class="err">/</span><span class="w"> </span><span class="py">100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">sale_price</span><span class="w"> </span><span class="py">DECIMAL</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">base_price</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">discount_amount</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">formatted_price</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">'$'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">ROUND</span><span class="p">(</span><span class="py">sale_price</span><span class="p">,</span><span class="w"> </span><span class="py">2</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">savings_display</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">discount_percentage</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Save</span><span class="w"> </span><span class="err">$'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">ROUND</span><span class="p">(</span><span class="py">discount_amount</span><span class="p">,</span><span class="w"> </span><span class="py">2</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">(</span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">discount_percentage</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'%</span><span class="w"> </span><span class="py">off</span><span class="p">)</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Stock</span><span class="w"> </span><span class="py">status</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">in_stock</span><span class="w"> </span><span class="py">BOOLEAN</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="py">stock_quantity</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">0</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">stock_status</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">stock_quantity</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Out</span><span class="w"> </span><span class="py">of</span><span class="w"> </span><span class="py">Stock</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">stock_quantity</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">5</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Only</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">stock_quantity</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="py">left</span><span class="p">!</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">stock_quantity</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">20</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Low</span><span class="w"> </span><span class="py">Stock</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="err">'</span><span class="py">In</span><span class="w"> </span><span class="py">Stock</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">stock_badge_color</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">stock_quantity</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">red</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">stock_quantity</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">5</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">orange</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">stock_quantity</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">20</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">yellow</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="err">'</span><span class="py">green</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Profit</span><span class="w"> </span><span class="py">metrics</span><span class="w"> </span><span class="p">(</span><span class="py">for</span><span class="w"> </span><span class="py">internal</span><span class="w"> </span><span class="py">use</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">profit_per_unit</span><span class="w"> </span><span class="py">DECIMAL</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="py">sale_price</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">cost</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">profit_margin_percent</span><span class="w"> </span><span class="py">DECIMAL</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(</span><span class="py">sale_price</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">cost</span><span class="p">)</span><span class="w"> </span><span class="err">/</span><span class="w"> </span><span class="py">NULLIF</span><span class="p">(</span><span class="py">sale_price</span><span class="p">,</span><span class="w"> </span><span class="py">0</span><span class="p">)</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Review</span><span class="w"> </span><span class="py">aggregation</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">avg_rating</span><span class="w"> </span><span class="py">DECIMAL</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SELECT</span><span class="w"> </span><span class="py">AVG</span><span class="p">(</span><span class="py">r</span><span class="err">.</span><span class="py">rating</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">this</span><span class="p">)</span><span class="err"><-</span><span class="p">[:</span><span class="nc">REVIEWS</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">r</span><span class="p">:</span><span class="nc">Review</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">review_count</span><span class="w"> </span><span class="py">INTEGER</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SELECT</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">this</span><span class="p">)</span><span class="err"><-</span><span class="p">[:</span><span class="nc">REVIEWS</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">r</span><span class="p">:</span><span class="nc">Review</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">rating_display</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">review_count</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">No</span><span class="w"> </span><span class="py">reviews</span><span class="w"> </span><span class="py">yet</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">ROUND</span><span class="p">(</span><span class="py">avg_rating</span><span class="p">,</span><span class="w"> </span><span class="py">1</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'/</span><span class="py">5</span><span class="w"> </span><span class="p">(</span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">review_count</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="py">reviews</span><span class="p">)</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">SEO</span><span class="err">-</span><span class="py">friendly</span><span class="w"> </span><span class="py">slug</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">url_slug</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">LOWER</span><span class="p">(</span><span class="py">REPLACE</span><span class="p">(</span><span class="py">REPLACE</span><span class="p">(</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">'-'</span><span class="p">),</span><span class="w"> </span><span class="err">''''</span><span class="p">,</span><span class="w"> </span><span class="err">''</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="user-profile-display" class="position-relative d-flex align-items-center group">
<span>User Profile Display</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="user-profile-display"
aria-haspopup="dialog"
aria-label="Share link: User Profile Display">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="py">PROPERTY</span><span class="w"> </span><span class="py">TYPE</span><span class="w"> </span><span class="py">UserProfile</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">user_id</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">username</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">first_name</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">last_name</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">bio</span><span class="w"> </span><span class="py">TEXT</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">location</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">website_url</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">twitter_handle</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">joined_date</span><span class="w"> </span><span class="py">TIMESTAMP</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">last_active_at</span><span class="w"> </span><span class="py">TIMESTAMP</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">profile_image_url</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">cover_image_url</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Display</span><span class="w"> </span><span class="py">name</span><span class="w"> </span><span class="py">logic</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">display_name</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">COALESCE</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">NULLIF</span><span class="p">(</span><span class="py">first_name</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">last_name</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="err">'</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">username</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">'</span><span class="py">User</span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">user_id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Membership</span><span class="w"> </span><span class="py">duration</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">member_since</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">DAY</span><span class="p">,</span><span class="w"> </span><span class="py">joined_date</span><span class="p">,</span><span class="w"> </span><span class="py">NOW</span><span class="p">())</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">30</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Joined</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">DAY</span><span class="p">,</span><span class="w"> </span><span class="py">joined_date</span><span class="p">,</span><span class="w"> </span><span class="py">NOW</span><span class="p">())</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="py">days</span><span class="w"> </span><span class="py">ago</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">MONTH</span><span class="p">,</span><span class="w"> </span><span class="py">joined_date</span><span class="p">,</span><span class="w"> </span><span class="py">NOW</span><span class="p">())</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">12</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Member</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">MONTH</span><span class="p">,</span><span class="w"> </span><span class="py">joined_date</span><span class="p">,</span><span class="w"> </span><span class="py">NOW</span><span class="p">())</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="py">months</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="err">'</span><span class="py">Member</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">YEAR</span><span class="p">,</span><span class="w"> </span><span class="py">joined_date</span><span class="p">,</span><span class="w"> </span><span class="py">NOW</span><span class="p">())</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="py">years</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Activity</span><span class="w"> </span><span class="py">status</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">activity_status</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">MINUTE</span><span class="p">,</span><span class="w"> </span><span class="py">last_active_at</span><span class="p">,</span><span class="w"> </span><span class="py">NOW</span><span class="p">())</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">5</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Online</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">HOUR</span><span class="p">,</span><span class="w"> </span><span class="py">last_active_at</span><span class="p">,</span><span class="w"> </span><span class="py">NOW</span><span class="p">())</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Active</span><span class="w"> </span><span class="py">recently</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">DAY</span><span class="p">,</span><span class="w"> </span><span class="py">last_active_at</span><span class="p">,</span><span class="w"> </span><span class="py">NOW</span><span class="p">())</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Active</span><span class="w"> </span><span class="py">today</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">DAY</span><span class="p">,</span><span class="w"> </span><span class="py">last_active_at</span><span class="p">,</span><span class="w"> </span><span class="py">NOW</span><span class="p">())</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">7</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Active</span><span class="w"> </span><span class="py">this</span><span class="w"> </span><span class="py">week</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="err">'</span><span class="py">Inactive</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">status_badge_color</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">MINUTE</span><span class="p">,</span><span class="w"> </span><span class="py">last_active_at</span><span class="p">,</span><span class="w"> </span><span class="py">NOW</span><span class="p">())</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">5</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">green</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">HOUR</span><span class="p">,</span><span class="w"> </span><span class="py">last_active_at</span><span class="p">,</span><span class="w"> </span><span class="py">NOW</span><span class="p">())</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">yellow</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="err">'</span><span class="py">gray</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Social</span><span class="w"> </span><span class="py">links</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">twitter_url</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">twitter_handle</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">https</span><span class="p">:</span><span class="err">//</span><span class="nc">twitter</span><span class="err">.</span><span class="py">com</span><span class="err">/'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">twitter_handle</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">profile_url</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">'/</span><span class="py">users</span><span class="err">/'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">username</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Profile</span><span class="w"> </span><span class="py">completeness</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">profile_completeness</span><span class="w"> </span><span class="py">INTEGER</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(</span><span class="py">CASE</span><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">first_name</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">10</span><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">END</span><span class="p">)</span><span class="w"> </span><span class="err">+</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(</span><span class="py">CASE</span><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">last_name</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">10</span><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">END</span><span class="p">)</span><span class="w"> </span><span class="err">+</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(</span><span class="py">CASE</span><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">bio</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">20</span><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">END</span><span class="p">)</span><span class="w"> </span><span class="err">+</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(</span><span class="py">CASE</span><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">location</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">10</span><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">END</span><span class="p">)</span><span class="w"> </span><span class="err">+</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(</span><span class="py">CASE</span><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">website_url</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">10</span><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">END</span><span class="p">)</span><span class="w"> </span><span class="err">+</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(</span><span class="py">CASE</span><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">profile_image_url</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">20</span><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">END</span><span class="p">)</span><span class="w"> </span><span class="err">+</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(</span><span class="py">CASE</span><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">cover_image_url</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">20</span><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">END</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">profile_complete</span><span class="w"> </span><span class="py">BOOLEAN</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="py">profile_completeness</span><span class="w"> </span><span class="err">></span><span class="p">=</span><span class="w"> </span><span class="py">80</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Truncated</span><span class="w"> </span><span class="py">bio</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">previews</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">bio_preview</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">LENGTH</span><span class="p">(</span><span class="py">bio</span><span class="p">)</span><span class="w"> </span><span class="err"><</span><span class="p">=</span><span class="w"> </span><span class="py">100</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">bio</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">SUBSTRING</span><span class="p">(</span><span class="py">bio</span><span class="p">,</span><span class="w"> </span><span class="py">1</span><span class="p">,</span><span class="w"> </span><span class="py">97</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="kd">...</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="financial-account-summary" class="position-relative d-flex align-items-center group">
<span>Financial Account Summary</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="financial-account-summary"
aria-haspopup="dialog"
aria-label="Share link: Financial Account Summary">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="py">PROPERTY</span><span class="w"> </span><span class="py">TYPE</span><span class="w"> </span><span class="py">Account</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">account_number</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">account_type</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">balance</span><span class="w"> </span><span class="py">DECIMAL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">currency</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">interest_rate</span><span class="w"> </span><span class="py">DECIMAL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">opened_date</span><span class="w"> </span><span class="py">DATE</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">status</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Display</span><span class="w"> </span><span class="py">formatting</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">masked_account_number</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">'****'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">SUBSTRING</span><span class="p">(</span><span class="py">account_number</span><span class="p">,</span><span class="w"> </span><span class="py">LENGTH</span><span class="p">(</span><span class="py">account_number</span><span class="p">)</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">3</span><span class="p">,</span><span class="w"> </span><span class="py">4</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">formatted_balance</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w"> </span><span class="py">currency</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="err">'</span><span class="py">USD</span><span class="err">'</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'$'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">ROUND</span><span class="p">(</span><span class="py">balance</span><span class="p">,</span><span class="w"> </span><span class="py">2</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="err">'</span><span class="py">EUR</span><span class="err">'</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'€'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">ROUND</span><span class="p">(</span><span class="py">balance</span><span class="p">,</span><span class="w"> </span><span class="py">2</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="err">'</span><span class="py">GBP</span><span class="err">'</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'£'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">ROUND</span><span class="p">(</span><span class="py">balance</span><span class="p">,</span><span class="w"> </span><span class="py">2</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">ROUND</span><span class="p">(</span><span class="py">balance</span><span class="p">,</span><span class="w"> </span><span class="py">2</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">currency</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Account</span><span class="w"> </span><span class="py">age</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">account_age_years</span><span class="w"> </span><span class="py">DECIMAL</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">DAY</span><span class="p">,</span><span class="w"> </span><span class="py">opened_date</span><span class="p">,</span><span class="w"> </span><span class="py">CURRENT_DATE</span><span class="p">)</span><span class="w"> </span><span class="err">/</span><span class="w"> </span><span class="py">365</span><span class="mf">.25</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">account_age_display</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">DAY</span><span class="p">,</span><span class="w"> </span><span class="py">opened_date</span><span class="p">,</span><span class="w"> </span><span class="py">CURRENT_DATE</span><span class="p">)</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">30</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">DAY</span><span class="p">,</span><span class="w"> </span><span class="py">opened_date</span><span class="p">,</span><span class="w"> </span><span class="py">CURRENT_DATE</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="py">days</span><span class="w"> </span><span class="py">old</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">MONTH</span><span class="p">,</span><span class="w"> </span><span class="py">opened_date</span><span class="p">,</span><span class="w"> </span><span class="py">CURRENT_DATE</span><span class="p">)</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">12</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">DATEDIFF</span><span class="p">(</span><span class="py">MONTH</span><span class="p">,</span><span class="w"> </span><span class="py">opened_date</span><span class="p">,</span><span class="w"> </span><span class="py">CURRENT_DATE</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="py">months</span><span class="w"> </span><span class="py">old</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">FLOOR</span><span class="p">(</span><span class="py">account_age_years</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="py">years</span><span class="w"> </span><span class="py">old</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Interest</span><span class="w"> </span><span class="py">calculations</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">monthly_interest</span><span class="w"> </span><span class="py">DECIMAL</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">balance</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">interest_rate</span><span class="w"> </span><span class="err">/</span><span class="w"> </span><span class="py">12</span><span class="w"> </span><span class="err">/</span><span class="w"> </span><span class="py">100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">annual_interest</span><span class="w"> </span><span class="py">DECIMAL</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">balance</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">interest_rate</span><span class="w"> </span><span class="err">/</span><span class="w"> </span><span class="py">100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">interest_display</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">interest_rate</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'%</span><span class="w"> </span><span class="py">APY</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Balance</span><span class="w"> </span><span class="py">status</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">balance_status</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">balance</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Overdrawn</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">balance</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Zero</span><span class="w"> </span><span class="py">Balance</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">balance</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">100</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Low</span><span class="w"> </span><span class="py">Balance</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">balance</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">10000</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Normal</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="err">'</span><span class="py">High</span><span class="w"> </span><span class="py">Balance</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">balance_badge_color</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">balance</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">red</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">balance</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">100</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">orange</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="err">'</span><span class="py">green</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Account</span><span class="w"> </span><span class="py">status</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">is_active</span><span class="w"> </span><span class="py">BOOLEAN</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="py">status</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">active</span><span class="err">'</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">is_frozen</span><span class="w"> </span><span class="py">BOOLEAN</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="py">status</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">frozen</span><span class="err">'</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">status_display</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w"> </span><span class="py">status</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="err">'</span><span class="py">active</span><span class="err">'</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Active</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="err">'</span><span class="py">frozen</span><span class="err">'</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Temporarily</span><span class="w"> </span><span class="py">Frozen</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="err">'</span><span class="py">closed</span><span class="err">'</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Closed</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="err">'</span><span class="py">pending</span><span class="err">'</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Pending</span><span class="w"> </span><span class="py">Activation</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">INITCAP</span><span class="p">(</span><span class="py">status</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="querying-virtual-properties" class="position-relative d-flex align-items-center group">
<span>Querying Virtual Properties</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="querying-virtual-properties"
aria-haspopup="dialog"
aria-label="Share link: Querying Virtual Properties">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="selection-and-filtering" class="position-relative d-flex align-items-center group">
<span>Selection and Filtering</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="selection-and-filtering"
aria-haspopup="dialog"
aria-label="Share link: Selection and Filtering">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Select</span><span class="w"> </span><span class="py">virtual</span><span class="w"> </span><span class="py">properties</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">first_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">last_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">full_name</span><span class="p">,</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Virtual</span><span class="w"> </span><span class="py">property</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="p">,</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Virtual</span><span class="w"> </span><span class="py">property</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">email_domain</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Virtual</span><span class="w"> </span><span class="py">property</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Filter</span><span class="w"> </span><span class="py">using</span><span class="w"> </span><span class="py">virtual</span><span class="w"> </span><span class="py">properties</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">></span><span class="p">=</span><span class="w"> </span><span class="py">21</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">is_adult</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">display_name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Sort</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">virtual</span><span class="w"> </span><span class="py">property</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">follower_ratio</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">follower_ratio</span><span class="w"> </span><span class="py">DESC</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">10</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="conditional-logic-with-virtual-properties" class="position-relative d-flex align-items-center group">
<span>Conditional Logic with Virtual Properties</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="conditional-logic-with-virtual-properties"
aria-haspopup="dialog"
aria-label="Share link: Conditional Logic with Virtual Properties">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Use</span><span class="w"> </span><span class="py">virtual</span><span class="w"> </span><span class="py">properties</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="py">CASE</span><span class="w"> </span><span class="py">expressions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">o</span><span class="p">:</span><span class="nc">Order</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">o</span><span class="err">.</span><span class="py">id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">o</span><span class="err">.</span><span class="py">total</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">o</span><span class="err">.</span><span class="py">age_category</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w"> </span><span class="py">o</span><span class="err">.</span><span class="py">price_tier</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="err">'</span><span class="py">luxury</span><span class="err">'</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Premium</span><span class="w"> </span><span class="py">Shipping</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="err">'</span><span class="py">premium</span><span class="err">'</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Express</span><span class="w"> </span><span class="py">Shipping</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="err">'</span><span class="py">Standard</span><span class="w"> </span><span class="py">Shipping</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">recommended_shipping</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Complex</span><span class="w"> </span><span class="py">filtering</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">in_stock</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">profit_margin_percent</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">20</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">avg_rating</span><span class="w"> </span><span class="err">></span><span class="p">=</span><span class="w"> </span><span class="py">4</span><span class="mf">.0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">formatted_price</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">stock_status</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">rating_display</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="performance-considerations" class="position-relative d-flex align-items-center group">
<span>Performance Considerations</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="performance-considerations"
aria-haspopup="dialog"
aria-label="Share link: Performance Considerations">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="optimization-strategies" class="position-relative d-flex align-items-center group">
<span>Optimization Strategies</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="optimization-strategies"
aria-haspopup="dialog"
aria-label="Share link: Optimization Strategies">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">AVOID</span><span class="p">:</span><span class="w"> </span><span class="nc">Expensive</span><span class="w"> </span><span class="py">aggregation</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="py">virtual</span><span class="w"> </span><span class="py">property</span><span class="w"> </span><span class="py">used</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="py">WHERE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">follower_count</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">1000</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Slow</span><span class="w"> </span><span class="py">if</span><span class="w"> </span><span class="py">follower_count</span><span class="w"> </span><span class="py">is</span><span class="w"> </span><span class="py">virtual</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">BETTER</span><span class="p">:</span><span class="w"> </span><span class="nc">Use</span><span class="w"> </span><span class="py">computed</span><span class="w"> </span><span class="py">property</span><span class="w"> </span><span class="py">or</span><span class="w"> </span><span class="py">index</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">idx_user_follower_count</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">User</span><span class="p">(</span><span class="py">follower_count</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">AVOID</span><span class="p">:</span><span class="w"> </span><span class="nc">Deep</span><span class="w"> </span><span class="py">relationship</span><span class="w"> </span><span class="py">traversal</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="py">virtual</span><span class="w"> </span><span class="py">property</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">friends_of_friends_count</span><span class="w"> </span><span class="py">INTEGER</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SELECT</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="py">DISTINCT</span><span class="w"> </span><span class="py">fof</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">this</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FRIEND</span><span class="p">]</span><span class="err">-</span><span class="p">()</span><span class="err">-</span><span class="p">[:</span><span class="nc">FRIEND</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">fof</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Too</span><span class="w"> </span><span class="py">expensive</span><span class="p">!</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">BETTER</span><span class="p">:</span><span class="w"> </span><span class="nc">Limit</span><span class="w"> </span><span class="py">depth</span><span class="w"> </span><span class="py">or</span><span class="w"> </span><span class="py">materialize</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">direct_friends_count</span><span class="w"> </span><span class="py">INTEGER</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SELECT</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">this</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FRIEND</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">f</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Much</span><span class="w"> </span><span class="py">faster</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="caching-virtual-property-results" class="position-relative d-flex align-items-center group">
<span>Caching Virtual Property Results</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="caching-virtual-property-results"
aria-haspopup="dialog"
aria-label="Share link: Caching Virtual Property Results">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">In</span><span class="w"> </span><span class="py">application</span><span class="w"> </span><span class="py">code</span><span class="p">,</span><span class="w"> </span><span class="py">cache</span><span class="w"> </span><span class="py">virtual</span><span class="w"> </span><span class="py">property</span><span class="w"> </span><span class="py">results</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Python</span><span class="w"> </span><span class="py">example</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">from</span><span class="w"> </span><span class="py">functools</span><span class="w"> </span><span class="py">import</span><span class="w"> </span><span class="py">lru_cache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">from</span><span class="w"> </span><span class="py">datetime</span><span class="w"> </span><span class="py">import</span><span class="w"> </span><span class="py">datetime</span><span class="p">,</span><span class="w"> </span><span class="py">timedelta</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">class</span><span class="w"> </span><span class="py">User</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nd">@property</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nd">@lru_cache</span><span class="p">(</span><span class="nc">maxsize</span><span class="p">=</span><span class="py">128</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">def</span><span class="w"> </span><span class="py">follower_count</span><span class="p">(</span><span class="py">self</span><span class="p">):</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Virtual property result cached for 5 minutes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">return</span><span class="w"> </span><span class="py">self</span><span class="err">.</span><span class="py">_calculate_follower_count</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Go example:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">type</span><span class="w"> </span><span class="nc">User</span><span class="w"> </span><span class="py">struct</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">followerCountCache</span><span class="w"> </span><span class="py">int</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">followerCountExpiry</span><span class="w"> </span><span class="py">time</span><span class="err">.</span><span class="py">Time</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">func</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="w"> </span><span class="err">*</span><span class="py">User</span><span class="p">)</span><span class="w"> </span><span class="py">FollowerCount</span><span class="p">()</span><span class="w"> </span><span class="py">int</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">if</span><span class="w"> </span><span class="py">time</span><span class="err">.</span><span class="py">Now</span><span class="p">()</span><span class="err">.</span><span class="py">Before</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">followerCountExpiry</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">return</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">followerCountCache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">count</span><span class="w"> </span><span class="p">:=</span><span class="w"> </span><span class="nc">u</span><span class="err">.</span><span class="py">calculateFollowerCount</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">followerCountCache</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">followerCountExpiry</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">time</span><span class="err">.</span><span class="py">Now</span><span class="p">()</span><span class="err">.</span><span class="py">Add</span><span class="p">(</span><span class="py">5</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">time</span><span class="err">.</span><span class="py">Minute</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">return</span><span class="w"> </span><span class="py">count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="best-practices" class="position-relative d-flex align-items-center group">
<span>Best Practices</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="best-practices"
aria-haspopup="dialog"
aria-label="Share link: Best Practices">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="design-guidelines" class="position-relative d-flex align-items-center group">
<span>Design Guidelines</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="design-guidelines"
aria-haspopup="dialog"
aria-label="Share link: Design Guidelines">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Keep Calculations Simple</strong>: Virtual properties should be fast (<10ms)</li>
<li><strong>Avoid Deep Traversals</strong>: Limit relationship traversal to 1-2 hops</li>
<li><strong>Use for Display Logic</strong>: Perfect for formatting, not complex business rules</li>
<li><strong>Handle NULL Values</strong>: Always use COALESCE or CASE for NULL safety</li>
<li><strong>Document Purpose</strong>: Explain why property is virtual vs computed/stored</li>
</ol>
<h4 id="when-to-convert-to-computedstored" class="position-relative d-flex align-items-center group">
<span>When to Convert to Computed/Stored</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="when-to-convert-to-computedstored"
aria-haspopup="dialog"
aria-label="Share link: When to Convert to Computed/Stored">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Convert to Computed Property If</strong>:</p>
<ul>
<li>Queried frequently (>1000 times/day)</li>
<li>Used in WHERE clauses often</li>
<li>Need to create index on the property</li>
<li>Calculation time > 50ms</li>
</ul>
<p><strong>Convert to Stored Property If</strong>:</p>
<ul>
<li>Value rarely changes</li>
<li>Need guaranteed consistent reads</li>
<li>Complex expensive calculation</li>
<li>Historical values matter</li>
</ul>
<h4 id="testing-virtual-properties" class="position-relative d-flex align-items-center group">
<span>Testing Virtual Properties</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="testing-virtual-properties"
aria-haspopup="dialog"
aria-label="Share link: Testing Virtual Properties">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Test</span><span class="w"> </span><span class="py">virtual</span><span class="w"> </span><span class="py">property</span><span class="w"> </span><span class="py">logic</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SELECT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">first_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">last_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">full_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Verify</span><span class="w"> </span><span class="py">calculation</span><span class="w"> </span><span class="py">manually</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">first_name</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">last_name</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">expected_full_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">FROM</span><span class="w"> </span><span class="py">User</span><span class="w"> </span><span class="py">u</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">full_name</span><span class="w"> </span><span class="err"><></span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">first_name</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">last_name</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">10</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Should</span><span class="w"> </span><span class="py">return</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">rows</span><span class="w"> </span><span class="py">if</span><span class="w"> </span><span class="py">logic</span><span class="w"> </span><span class="py">is</span><span class="w"> </span><span class="py">correct</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="common-patterns" class="position-relative d-flex align-items-center group">
<span>Common Patterns</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="common-patterns"
aria-haspopup="dialog"
aria-label="Share link: Common Patterns">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="default-value-pattern" class="position-relative d-flex align-items-center group">
<span>Default Value Pattern</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="default-value-pattern"
aria-haspopup="dialog"
aria-label="Share link: Default Value Pattern">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">display_value</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">COALESCE</span><span class="p">(</span><span class="py">NULLIF</span><span class="p">(</span><span class="py">custom_value</span><span class="p">,</span><span class="w"> </span><span class="err">''</span><span class="p">),</span><span class="w"> </span><span class="py">default_value</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="py">N</span><span class="err">/</span><span class="py">A</span><span class="err">'</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="conditional-display-pattern" class="position-relative d-flex align-items-center group">
<span>Conditional Display Pattern</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="conditional-display-pattern"
aria-haspopup="dialog"
aria-label="Share link: Conditional Display Pattern">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">status_display</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">condition1</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Display</span><span class="w"> </span><span class="py">Text</span><span class="w"> </span><span class="py">1</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">condition2</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="py">Display</span><span class="w"> </span><span class="py">Text</span><span class="w"> </span><span class="py">2</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="err">'</span><span class="py">Default</span><span class="w"> </span><span class="py">Display</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="aggregation-pattern" class="position-relative d-flex align-items-center group">
<span>Aggregation Pattern</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="aggregation-pattern"
aria-haspopup="dialog"
aria-label="Share link: Aggregation Pattern">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">count_related</span><span class="w"> </span><span class="py">INTEGER</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SELECT</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">this</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">RELATED</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">related</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="formatting-pattern" class="position-relative d-flex align-items-center group">
<span>Formatting Pattern</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="formatting-pattern"
aria-haspopup="dialog"
aria-label="Share link: Formatting Pattern">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">formatted_value</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">prefix</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">CAST</span><span class="p">(</span><span class="py">numeric_value</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">STRING</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">suffix</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="troubleshooting" class="position-relative d-flex align-items-center group">
<span>Troubleshooting</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="troubleshooting"
aria-haspopup="dialog"
aria-label="Share link: Troubleshooting">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="slow-query-performance" class="position-relative d-flex align-items-center group">
<span>Slow Query Performance</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="slow-query-performance"
aria-haspopup="dialog"
aria-label="Share link: Slow Query Performance">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Use</span><span class="w"> </span><span class="py">EXPLAIN</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">identify</span><span class="w"> </span><span class="py">slow</span><span class="w"> </span><span class="py">virtual</span><span class="w"> </span><span class="py">properties</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">EXPLAIN</span><span class="w"> </span><span class="py">ANALYZE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SELECT</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">virtual_property</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">FROM</span><span class="w"> </span><span class="py">User</span><span class="w"> </span><span class="py">u</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">another_virtual_property</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">100</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Profile</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span><span class="nc">execution</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">PROFILE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SELECT</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="py">User</span><span class="w"> </span><span class="py">LIMIT</span><span class="w"> </span><span class="py">100</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Check</span><span class="w"> </span><span class="py">time</span><span class="w"> </span><span class="py">spent</span><span class="w"> </span><span class="py">evaluating</span><span class="w"> </span><span class="py">virtual</span><span class="w"> </span><span class="py">properties</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="null-handling-issues" class="position-relative d-flex align-items-center group">
<span>NULL Handling Issues</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="null-handling-issues"
aria-haspopup="dialog"
aria-label="Share link: NULL Handling Issues">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Problem</span><span class="p">:</span><span class="w"> </span><span class="nc">NULL</span><span class="w"> </span><span class="py">concatenation</span><span class="w"> </span><span class="py">returns</span><span class="w"> </span><span class="py">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">full_address</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">street</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">city</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">state</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Returns</span><span class="w"> </span><span class="py">NULL</span><span class="w"> </span><span class="py">if</span><span class="w"> </span><span class="py">any</span><span class="w"> </span><span class="py">field</span><span class="w"> </span><span class="py">is</span><span class="w"> </span><span class="py">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Solution</span><span class="p">:</span><span class="w"> </span><span class="nc">Use</span><span class="w"> </span><span class="py">COALESCE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">VIRTUAL</span><span class="w"> </span><span class="py">full_address</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">COALESCE</span><span class="p">(</span><span class="py">street</span><span class="p">,</span><span class="w"> </span><span class="err">''</span><span class="p">)</span><span class="w"> </span><span class="p">||</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">city</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">city</span><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="err">''</span><span class="w"> </span><span class="py">END</span><span class="w"> </span><span class="p">||</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">state</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="w"> </span><span class="p">||</span><span class="w"> </span><span class="py">state</span><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="err">''</span><span class="w"> </span><span class="py">END</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="related-topics" class="position-relative d-flex align-items-center group">
<span>Related Topics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="related-topics"
aria-haspopup="dialog"
aria-label="Share link: Related Topics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><a
href="/tags/computed-properties/"
>Computed Properties</a>
- Stored calculated properties</li>
<li><a
href="/tags/materialized-views/"
>Materialized Views</a>
- Cached query results</li>
<li><a
href="/tags/types/"
>Types</a>
- Type definitions</li>
<li><a
href="/tags/performance/"
>Performance</a>
- Query optimization</li>
</ul>
<h3 id="further-reading" class="position-relative d-flex align-items-center group">
<span>Further Reading</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="further-reading"
aria-haspopup="dialog"
aria-label="Share link: Further Reading">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><a
href="https://oracle-base.com/articles/11g/virtual-columns-11gr1"
aria-label="Virtual Columns (Oracle) – opens in new window"
target="_blank" rel="noopener noreferrer"
>Virtual Columns (Oracle)
<span aria-hidden="true" class="external-icon">↗</span>
</a>
- Oracle documentation</li>
<li><a
href="https://dev.mysql.com/doc/refman/8.0/en/create-table-generated-columns.html"
aria-label="Generated Columns (MySQL) – opens in new window"
target="_blank" rel="noopener noreferrer"
>Generated Columns (MySQL)
<span aria-hidden="true" class="external-icon">↗</span>
</a>
- MySQL reference</li>
<li><a
href="https://docs.microsoft.com/en-us/sql/relational-databases/tables/specify-computed-columns-in-a-table"
aria-label="Computed Columns (SQL Server) – opens in new window"
target="_blank" rel="noopener noreferrer"
>Computed Columns (SQL Server)
<span aria-hidden="true" class="external-icon">↗</span>
</a>
- SQL Server guide</li>
</ul>
Related Articles
No articles found with this tag yet.
Back to Home