parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Можно написать классик, который будет делать запросы через table.select...

Sumo 31.12.2017 10:04 / 31.12.2017 10:30

И писать запросы не только на равенство, а вообще по любому набору условий.

Но лучше всего положить данные в базу и не заниматься эмулированием СУБД на Парсере. :)
@main[]
  $db[^JsonDB::load[db.json]]

  Select all:
  ^print[^db.select[][$.orderBy{$db.id}]]

  Conditions:
  ^print[^db.select($db.server eq "example.ru")]

  $lDateTime[^date::create[2018-12-30T18:06:10+00:00]]
  ^print[^db.select($db.email eq "mail@mail.com" && $db.expires < ^lDateTime.unix-timestamp[])]

  Limits:
  ^print[^db.select($db.email eq "mail@mail.com")[$.limit(1) $.reverse(1)]]

@print[aData]
  $result[^json:string[$aData;$.indent(true)]^#0A]



@CLASS
JsonDB

@OPTIONS
locals

@load[aFileName]
  $self._fileName[$aFileName]
  $self._db[^file::load[text;$aFileName]]

  $self._keys[]
  $self._db[^json:parse[^taint[as-is][$self._db.text];$.array[$self._parseData]]]

@GET_DEFAULT[aKeyName]
  $result[^if(^self._keys.[contains][$aKeyName]){$self._db.data.[$aKeyName]}]

@select[aCond;aOptions]
## aOptions.orderBy
## aOptions.limit
## aOptions.offset
## aOptions.reverse
  $aOptions[^hash::create[$aOptions]]
  $lSelectOptions[^hash::create[]]
  ^aOptions.foreach[k;v]{
    ^if($k eq "limit" || $k eq "offset" || $k eq "reverse"){
      $lSelectOptions.[$k]($v)
    }
  }

  ^if(def $aCond){
    $result[^self._db.data.select($aCond)[$lSelectOptions]]
  }{
    $result[^table::create[$self._db.data][$lSelectOptions]]
  }

  ^if(^aOptions.contains[orderBy]){
    ^result.sort{$aOptions.orderBy}
  }

@_parseData[key;value]
  $result[]
  ^if($value){
    $lKeys[^value.0.keys[]]
    $result[^process{^^table::create{^lKeys.foreach[k;v]{$v.key}[^#09]}}]
    ^value.foreach[k;v]{
      ^result.append[$v]
    }
    $self._keys[^lKeys.hash[key;key;$.type[string]]]
  }