JS a Expression trees rubrika: Programování: JavaScript

7 xxar3s
položil/-a 21.5.2016

Ako v JS spravit z funkcie expression tree?

potreboval by som takyto JS kod:

db.Users
  .map(u => ({ Nick: u.Nickname, Login: u.Login }))
  .filter(u => u.IsActive == 1 && u.RoleId == 1)
  .sort(u => u.CreationDate)
  .fetch();

pri zavolani fetch previest na:

SELECT u.Nickname AS Nick, u.Login
FROM Users u
WHERE u.IsActive = 1 AND u.RoleId = 1
ORDER BY u.CreationDate

Mate nejake napady ako na to?

odkaz
6 roman.hocke
odpověděl/-a 23.5.2016
 
upravil/-a 23.5.2016

A co takhle ho nenutit ten AST sestavovat z JS syntaxe, ale prostě nechat programátora ten AST naspat v tebou definované formě? Něco ala:

.filter({ 
    'operator': '&&', 
    'children': [
        {
            'operator': '==',
            'children': [
                {
                    'table': 'u',
                    'column': 'isActive'
                },
                {
                    'value': 1
                }
            ]
        },
        {
            'operator': '==',
            'children': [
                {
                    'table': 'u',
                    'column': 'roleId'
                },
                {
                    'value': 1
                }
            ]
        }
    ]
})

Vím že je to na pohled obluda, ale stejně nějaký takový AST budeš interně konstruovat. Pokud zvolíš rozumný syntactic sugar, mohlo by to být ve finále i čitelné :-)

Komentáře

  • Honza Břešťan : Tohle je u nehomoikonickeho jazyka asi nejcistsi, ale je to strasne ukecane i pro trivialni dotazy - neni pak po vsech smerech jednodussi rovnou psat to SQL? 23.5.2016
  • harrison314 : Aj mne pride v tomto pripade menej ukecane SQL-ko, alebo aspon JS alternativa HSQL-ka. 23.5.2016
  • roman.hocke : Jj, taky mi to přijde ukecané, ukecanost by se dala snížit tak, že se ty jednotlivé operace nebudou tak složitě vypisovat, ale zaobalí se třeba do funkcí apod. Na druhou stranu se potom dá s tím dotazem pracovat bez parsování - např. kontrolovat použité sloupečky apod. Záleží, co si od toho původní tazatel slibuje :-) 24.5.2016
  • kohven : I tak mi přijde, že by to skončilo závorkovým peklem jak v LISPu. Napadají mě varianty: o('&&',o('==',c('u','isActive'),1),o('==',c('u','roleId'),1)) nebo infixově o(o(c('u','isActive'),'==',1),'&&',o(c('u','roleId'),'==',1)). A asi bych nechtěl číst ani tohle. Nějaký parser by to asi chtělo. Asi by se to dalo řešit podobně, jako řeší react xhtml v js. 24.5.2016

Pro zobrazení všech 3 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.