1
0
Derivar 0
BasesParserSLan/Src/Query/Query.mqh
Nique_372 3de33ea162
2026-07-20 07:27:42 -05:00

355 linhas
9,2 KiB
MQL5

//+------------------------------------------------------------------+
//| Query.mqh |
//| Copyright 2026, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property strict
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#include "Def.mqh"
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
namespace TSN
{
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class CSLDomQuery
{
private:
//---
CDomNodeManager* m_dom;
//---
long m_bytecode[];
int m_bytecode_s;
int m_bytecode_r;
//---
string m_str[128];
int m_str_s;
//---
union LD
{
ulong l;
double d;
};
//---
//- iteracion de obj
CHashMapFastIterator(string, CDomNodeBase*) m_stack_it_obj[256];
//- iteracion de array
int m_stack_it_ix[256];
int m_stack_it_k[256];
int m_stack_it_count[256];
//- cacheables
int m_stack_it_curr;
int m_stack_it_s;
//---
CDomNodeBase* m_curr;
bool m_last_bool_r;
//CDomNodeBase* m_root;
public:
CSLDomQuery(void) {}
~CSLDomQuery(void) {}
int Run(CDomNodeBase& *elemts[]);
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
// si es arr entonces solo se peude con size
#define DOMPATHQUEY_MACRO_U(X) \
switch(t) \
{ \
case TSN_SBL_BASE_TYPE_OBJ: \
case TSN_SBL_BASE_TYPE_ARR: \
{\
m_last_bool_r = (m_curr.Size() X m_bytecode[p + 1]); \
break;\
} \
case TSN_SBL_BASE_TYPE_INT: \
{ \
m_last_bool_r = (m_curr.m_v.iv X m_bytecode[p + 1]); \
break; \
} \
case TSN_SBL_BASE_TYPE_FLT:\
{\
static LD un;\
un.l = m_bytecode[p + 1];\
m_last_bool_r = (m_curr.m_v.dv X un.d);\
break;\
}\
case TSN_SBL_BASE_TYPE_BOL:\
{\
m_last_bool_r = (m_curr.m_v.bv X bool((m_bytecode[p] >> TSN_DOMPATH_BIT_INS_V_BOOL_START) & 1));\
break;\
}\
case TSN_SBL_BASE_TYPE_STR:\
{\
const int ix = m_curr.m_v.ix;\
m_last_bool_r = (m_dom.m_string_stack[ix] X m_str[m_bytecode[p] >> TSN_DOMPATH_BIT_INS_V_STR_START_I]);\
break;\
}\
default:\
break;\
}\
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CSLDomQuery::Run(CDomNodeBase& *elemts[])
{
//---
int p = 0;
//---
while(p < m_bytecode_s)
{
switch((m_bytecode[p]&TSN_DOMPATH_MASK_INS_TYPE))
{
case DOMPATH_QUERY_INS_TYPE_ACCESO_KEY:
{
m_curr = m_curr[m_str[m_bytecode[p++] >> TSN_DOMPATH_BIT_INS_ETYPE]]; // Acceso
break;
}
case DOMPATH_QUERY_INS_TYPE_ACCESO_IDX:
{
m_curr = m_curr[m_bytecode[p++] >> TSN_DOMPATH_BIT_INS_ETYPE]; // Acceso
break;
}
case DOMPATH_QUERY_INS_TYPE_INICIAR_ITERACION:
{
//m_stack_it_curr = m_stack_it_s++;
if(m_curr.m_type == TSN_SBL_BASE_TYPE_OBJ)
{
m_stack_it_obj[m_stack_it_curr] = m_curr.BenginIteration();
}
else
{
}
m_stack_it_curr++;
break;
}
case DOMPATH_QUERY_INS_TYPE_ITER_ASSING:
{
if(m_curr.m_type == TSN_SBL_BASE_TYPE_OBJ)
{
if(m_stack_it_obj[m_stack_it_curr].IsValid())
{
m_curr = m_stack_it_obj[m_stack_it_curr].Val();
m_stack_it_obj[m_stack_it_curr].Next();
p++; // Siguiente instrucciones
}
else // SI no es valido
{
// Saltamos x posciones....
p += int(m_bytecode[p] >> TSN_DOMPATH_BIT_INS_ETYPE);
}
}
else
{
}
break;
}
case DOMPATH_QUERY_INS_TYPE_EXIT:
{
break;
}
case DOMPATH_QUERY_INS_TYPE_COMPARE_IS: // comara que no este vacio .empty() o .size()
{
//----
m_last_bool_r = false;
//---
if(((1 << m_curr.m_type) & (TSN_SBL_BASE_F_OBJ | TSN_SBL_BASE_F_ARR)) == 0)
break; // Sale de golpe
//---
const int opt = int(m_bytecode[p] >> TSN_DOMPATH_BIT_INS_ETYPE) & TSN_DOMPATH_MASK_COMPARE;
const int t = m_curr.Size();
//---
switch(opt)
{
case TSN_DOMPATH_OA_T_SIZE:
{
m_last_bool_r = bool(t); // true si no es 0 false si es 0
break;
}
case TSN_DOMPATH_OA_T_EMPT:
{
m_last_bool_r = t == 0; // true si esta vacio
break;
}
default:
break;
}
break;
}
case DOMPATH_QUERY_INS_TYPE_COMPARE_MENOR:
{
//----
m_last_bool_r = false;
//---
const int t = int(m_bytecode[p] >> TSN_DOMPATH_BIT_INS_ETYPE) & TSN_DOMPATH_MASK_COMPARE;
if(t != m_curr.m_type)
break;
//---
DOMPATHQUEY_MACRO_U( <)
break;
}
case DOMPATH_QUERY_INS_TYPE_COMPARE_MAYOR:
{
//----
m_last_bool_r = false;
//---
const int t = int(m_bytecode[p] >> TSN_DOMPATH_BIT_INS_ETYPE) & TSN_DOMPATH_MASK_COMPARE;
if(t != m_curr.m_type)
break;
//---
DOMPATHQUEY_MACRO_U( >)
break;
}
case DOMPATH_QUERY_INS_TYPE_COMPARE_MENOR_IGUAL:
{
//----
m_last_bool_r = false;
//---
const int t = int(m_bytecode[p] >> TSN_DOMPATH_BIT_INS_ETYPE) & TSN_DOMPATH_MASK_COMPARE;
if(t != m_curr.m_type)
break;
//---
DOMPATHQUEY_MACRO_U( <=)
break;
}
case DOMPATH_QUERY_INS_TYPE_COMPARE_MAYOR_IGUAL:
{
//----
m_last_bool_r = false;
//---
const int t = int(m_bytecode[p] >> TSN_DOMPATH_BIT_INS_ETYPE) & TSN_DOMPATH_MASK_COMPARE;
if(t != m_curr.m_type)
break;
//---
DOMPATHQUEY_MACRO_U( >=)
break;
}
case DOMPATH_QUERY_INS_TYPE_COMPARE_NO_IGUAL:
{
//----
m_last_bool_r = false;
//---
const int t = int(m_bytecode[p] >> TSN_DOMPATH_BIT_INS_ETYPE) & TSN_DOMPATH_MASK_COMPARE;
if(t != m_curr.m_type)
break;
//---
DOMPATHQUEY_MACRO_U( !=)
break;
}
case DOMPATH_QUERY_INS_TYPE_COMPARE_IGUAL:
{
//----
m_last_bool_r = false;
//---
const int t = int(m_bytecode[p] >> TSN_DOMPATH_BIT_INS_ETYPE) & TSN_DOMPATH_MASK_COMPARE;
if(t != m_curr.m_type)
break;
//---
DOMPATHQUEY_MACRO_U( ==)
break;
}
case DOMPATH_QUERY_INS_TYPE_JUMP_IS_TRUE:
{
if(m_last_bool_r)
{
p += int(m_bytecode[p] >> TSN_DOMPATH_BIT_INS_ETYPE);
break;
}
p++;
break;
}
case DOMPATH_QUERY_INS_TYPE_JUMP_IS_FALSE:
{
if(m_last_bool_r)
{
// Si cumple entonces normal
p++;
break;
}
// No cumple saltamos..
p += int(m_bytecode[p] >> TSN_DOMPATH_BIT_INS_ETYPE);
break;
}
default:
break;
}
}
}
}
//+------------------------------------------------------------------+
/*
{
"precios": {
"libro1": {"valor":[20]},
"libro2": {"valor":[10]},
"libro3": {"valor":[15]}
}
}
$.
precios.
[*].
valor
$.precios[*].valor[?(@ > 10 || @ < 20 || 20 == 20)]
→ [20, 15]
----
Acceso a "precios"
Inciar iteracion
Asignar elemento y mover (en caso termine jump a fin:, de lo contrario continuar)
Accceso a "valor"
Inciar iteracion
Asignar elemento y mover (en caso termine vuelve a jump: "Asignar elemento y mover")
Comparar > 10 (en caso no concinda jumpo a la nstruccion previa, si conice siugiente intrucciones)
Añadir elemento actual al array de elementos (vuelve a Asignar elemento y mover)
fin: return.. (terminar)
*/
//+------------------------------------------------------------------+