parser

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

 

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

Простой пример выглядит так...

Sumo 05.04.2014 21:40 / 05.04.2014 21:47

@onTest1[aRequest][locals]
  $lFlates[^core.regions.flates.aggregate[_fields(flatID, flatID, houseID, flatNumber, address, regionID, createdAt);
    $.houseID[57]
    $.orderBy[$.flatNumber[desc]]
    $.asHash(true)
    $.limit(5)
    $.offset(^aRequest.offset.int(0))
  ]]
  $lFlates[^_processFlates[$lFlates]]

  $result[
    $.type[as-is]
    $.content-type[application/json]
    $.body[^json:string[$lFlates;$.indent(true)]]
  ]

@_processFlates[aFlates][locals]
  $result[^hash::create[$aFlates]]
  ^result.foreach[k;v]{
      $v.formatedDate[^formater.date[$v.createdAt]]
      $v.rnd[^math:random(25)]
      $v.formatedRnd[$v.rnd ^formater.numberDecline[$v.rnd;число;числа;чисел]]
  } 
SQL-запрос получился такой:
select `flt`.`flat_id` as `flatID`, `flt`.`flat_id` as `flatID`, `flt`.`house_id` as `houseID`, `flt`.`flat_number` as `flatNumber`, concat(`str`.`street_name`,
", д. ", `hs`.`house_number`,
if(`hs`.`house_korp` != "", concat(", корп. ", `hs`.`house_korp`), ""),
if(`hs`.`house_str` != "", concat(", стр. ", `hs`.`house_str`), ""),
if(`flt`.`flat_number` != "", concat(", кв. ", `flt`.`flat_number`), "")
)
as `address`, `hs`.`region_id` as `regionID`, `flt`.`created_at` as `createdAt`
from `regions_flates` as `flt`
join `regions_houses` as `hs` on (`flt`.`house_id` = `hs`.`house_id`)
join `regions_streets` as `str` on (`hs`.`street_id` = `str`.`street_id`)
left join `regions_accounts` as `acc` on (`flt`.`flat_id` = `acc`.`flat_id`)
where 1=1 and (`flt`.`house_id` = 57)
group by flatID
order by `flt`.`flat_number` desc
limit 5
В браузере получил json:
{
	"3891533":{
		"flatID":"3891533",
		"houseID":"57",
		"flatNumber":"99",
		"address":"Ивана Бабушкина ул., д. 3, кв. 99",
		"regionID":"281",
		"createdAt":"2013-08-05 14:26:06",
		"formatedDate":"5 августа 2013 г.",
		"rnd":"2",
		"formatedRnd":"2 числа"
	},
	"3891532":{
		"flatID":"3891532",
		"houseID":"57",
		"flatNumber":"98",
		"address":"Ивана Бабушкина ул., д. 3, кв. 98",
		"regionID":"281",
		"createdAt":"2013-08-05 14:26:06",
		"formatedDate":"5 августа 2013 г.",
		"rnd":"7",
		"formatedRnd":"7 чисел"
	},
	"3891531":{
		"flatID":"3891531",
		"houseID":"57",
		"flatNumber":"97",
		"address":"Ивана Бабушкина ул., д. 3, кв. 97",
		"regionID":"281",
		"createdAt":"2013-08-05 14:26:06",
		"formatedDate":"5 августа 2013 г.",
		"rnd":"15",
		"formatedRnd":"15 чисел"
	},
	"3891530":{
		"flatID":"3891530",
		"houseID":"57",
		"flatNumber":"96",
		"address":"Ивана Бабушкина ул., д. 3, кв. 96",
		"regionID":"281",
		"createdAt":"2013-08-05 14:26:06",
		"formatedDate":"5 августа 2013 г.",
		"rnd":"24",
		"formatedRnd":"24 числа"
	},
	"3891529":{
		"flatID":"3891529",
		"houseID":"57",
		"flatNumber":"95",
		"address":"Ивана Бабушкина ул., д. 3, кв. 95",
		"regionID":"281",
		"createdAt":"2013-08-05 14:26:06",
		"formatedDate":"5 августа 2013 г.",
		"rnd":"7",
		"formatedRnd":"7 чисел"
	}
}
Мне кажется, что сортировка по flatNumber правильная, а не вразнобой.

Пару замечаний по вашему и моему коду:
— Чтобы добавить поле одновременно и как ключ и как значение «строки» достаточно дважды его продублировать. Если бы использовался метод all, то это было бы проделано автоматически.
— Функция datePlays ужасна. Она меняет содержимое объекта (добавляет поля), который ей передали в качестве параметра. Переменная _plays вообще не нужна [она вообще локальная? если нет, то и тут есть проблемы]. Сделать это можно гораздо аккуратнее — см. метод processFlates моем примере.
— С офсетом можно обойтись проще. Хотя имеет смысл проверять его еще и на >= 0. :)

У меня версия 3.4.4b, но и на всей ветке 3.4 поведение такое же (уже 5 лет).