derivado de nique_372/BasesParserSLan
355 linhas
9,2 KiB
MQL5
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)
|
|
|
|
*/
|
|
//+------------------------------------------------------------------+
|