Запрос массива участников через концепции - PullRequest
0 голосов
/ 29 мая 2018

Вот так выглядит мой файл модели.

participant Doctor identified by doctorID {
o String doctorID
o String contact 
o String doctorName
o String description
--> Schedule schedule
}

asset Schedule identified by scheduleID{
 o String scheduleID
 o Day availableDays 

}

concept Time{
--> Doctor[] AM00
--> Doctor[] AM01
--> Doctor[] AM02
--> Doctor[] AM03 
--> Doctor[] AM04 
--> Doctor[] AM05 
--> Doctor[] AM06
--> Doctor[] AM07 
--> Doctor[] AM08
--> Doctor[] AM09 
--> Doctor[] AM10 
--> Doctor[] AM11 
--> Doctor[] PM00
--> Doctor[] PM01
--> Doctor[] PM02
--> Doctor[] PM03 
--> Doctor[] PM04 
--> Doctor[] PM05 
--> Doctor[] PM06 
--> Doctor[] PM07 
--> Doctor[] PM08 
--> Doctor[] PM09 
--> Doctor[] PM10 
--> Doctor[] PM11
 }
concept Day{
o Time  monday
o Time  tuesday
o Time  wednesday
o Time  thursday
o Time  friday
o Time  saturday
o Time  sunday
}

Я пытаюсь написать запрос, который будет отображать всех доступных врачей в определенный час.Например, если я ищу врачей в понедельник в 00:00, то нужно вернуть массив докторов AM00.

Я пытаюсь что-то вроде этого

query getAvailableDoctors {
description: "Returns a list of doctors available at a specific hour"
statement:
  SELECT org.acme.Doctor
  FROM org.acme.Schedule
  WHERE (schedule.availableDays.monday.AM00 CONTAINS('resource:org.acme.Doctor') )
}

Но всеэто возвращает NULL, когда в массиве AM00 хранятся зараженные врачи.Я делаю это неправильно?Или есть лучший способ сделать запрос?

1 Ответ

0 голосов
/ 30 мая 2018

Я бы предложил следующую [модель, определение запроса и т. Д.], Как показано ниже - она ​​основана на том факте, что вы пошли по «концептуальному» маршруту (вы также можете использовать простые массивы и слегка запросить массив дней / часов).другая модель но это на другой день).Ваш запрос (выше) не будет работать, потому что вы не можете «шагнуть» по объектам в определении вашего запроса - он не похож на базу данных SQL (просто чтобы прояснить это).

Модель нижеобеспечивает концепцию Availability для записи матрицы доступности доктора в активе Schedule (отсюда и связь с доктором).Кроме того, это массив концепций, позволяющих составлять почасовые расписания в течение каждого дня для этого идентификатора расписания.Наконец, врач (или группа врачей) - может быть связан с этим графиком - если он один на один, то, очевидно, вам нужно предоставить только одну запись «врача».Смотрите мой пример данных JSON для schedule ниже.Аналогично, врач (участник) может иметь отношение к одному или нескольким графикам (или нет, в зависимости от обстоятельств - вариант все равно есть), как вы увидите у участника Doctor, у меня есть дополнительный schedule (массив расписаний) - в этом случае он будет хранить данные концепции (внутри актива) в фактической записи участника (тогда вы запросите это вместо этого) - но вы можете не захотеть управлять данными расписания внутри участника для очевидногопричины).Примечание: это всего лишь одно предложение, основанное на том, что вы опубликовали, - существует множество способов очистить апельсин: -)

participant Doctor identified by doctorID {
o String doctorID
o String contact 
o String doctorName
o String description
o Schedule[] schedule optional // see comment below
}

asset Schedule identified by scheduleID {
 o String scheduleID
 o Availability[] availability
 --> Doctor[] doctor
}

concept Availability {
o WeekDay Day 
o Hours Hour 
}

enum WeekDay {
o MON
o TUE
o WED
o THU
o FRI
o SAT
o SUN
}

enum Hours {
o H00
o H01
o H02
o H03
o H04
o H05
o H06
o H07
o H08
o H09
o H10
o H11
o H12
o H13
o H14
o H15
o H16
o H17
o H18
o H19
o H20
o H21
o H22
o H23

}

С помощью этой модели вы можете теперь определить свой концептуальный запрос.

Пример 1:

query doctordoctor1 { 
  description: "Select all doctors available at 1st hour on MON only" 
  statement: SELECT org.acme.mynetwork.Schedule 
  WHERE ( availability CONTAINS (Day == "MON" AND Hour == "H01" )   ) 
}

вернет только Расписание № 4 и, следовательно, Доктора № 1 и № 2 (а не Доктора 3 или 4)

Пример 2:

query doctordoctor2 { 
  description: "Select all doctors available at 1st hour - any day" 
  statement: SELECT org.acme.mynetwork.Schedule 
  WHERE ( availability CONTAINS (Hour == "H01" )   ) 
}

вернет Расписание № 4 и № 5, что означает, что врачи № 1 и № 2, а также плюс, врачи № 3 и № 4 будут совпадать.

Просьба учесть, что НЕ вернет данные Доктора.профиль в этом запросе, пожалуйста, обратите внимание - вы можете вызвать запрос в транзакции, а затем получить соответствующую информацию о докторе (то есть, если требуется) для каждого найденного доктора, поскольку существует связь с возвращенным объектом запроса (расписание).

=================== ДАННЫЕ ========= (оставлено здесь, но можно положить в пастин)

{
  "$class": "org.acme.mynetwork.Schedule",
  "scheduleID": "4",
  "availability": [
    {
      "$class": "org.acme.mynetwork.Availability",
      "Day": "MON",
      "Hour": "H01"
    },
    {
      "$class": "org.acme.mynetwork.Availability",
      "Day": "MON",
      "Hour": "H02"
    },
    {
      "$class": "org.acme.mynetwork.Availability",
      "Day": "MON",
      "Hour": "H03"
    },
    {
      "$class": "org.acme.mynetwork.Availability",
      "Day": "TUE",
      "Hour": "H04"
    },
    {
      "$class": "org.acme.mynetwork.Availability",
      "Day": "TUE",
      "Hour": "H05"
    },
    {
      "$class": "org.acme.mynetwork.Availability",
      "Day": "TUE",
      "Hour": "H06"
    }
  ],
  "doctor": [
    "resource:org.acme.mynetwork.Doctor#1",
    "resource:org.acme.mynetwork.Doctor#2"
  ]
}

следующий элемент

{
  "$class": "org.acme.mynetwork.Schedule",
  "scheduleID": "5",
  "availability": [
    {
      "$class": "org.acme.mynetwork.Availability",
      "Day": "WED",
      "Hour": "H01"
    },
    {
      "$class": "org.acme.mynetwork.Availability",
      "Day": "WED",
      "Hour": "H02"
    },
    {
      "$class": "org.acme.mynetwork.Availability",
      "Day": "THU",
      "Hour": "H03"
    },
    {
      "$class": "org.acme.mynetwork.Availability",
      "Day": "FRI",
      "Hour": "H04"
    },
    {
      "$class": "org.acme.mynetwork.Availability",
      "Day": "SAT",
      "Hour": "H05"
    },
    {
      "$class": "org.acme.mynetwork.Availability",
      "Day": "SAT",
      "Hour": "H06"
    }
  ],
  "doctor": [
    "resource:org.acme.mynetwork.Doctor#3",
    "resource:org.acme.mynetwork.Doctor#4"
  ]
}

==== КОД для вызова запроса из процессора транзакций - или просто вызовите его

из REST API

/**
 * Track the schedule
 * @param {org.acme.mynetwork.doctor} doctor - the query object as a trxn
 * @transaction
 */

function doctor(doctor) {

  console.log('got inside doctor function');
  return query('doctordoctor') // 
        .then(function (results) {

           var schedule_asset = [];
           for (var n = 0; n < results.length; n++) {
                   var schedule_asset = results[n];
                   console.log('The transaction object ' + (n+1) + ', object is ' +  schedule_asset);
                   console.log('Schedule identifier is: ' + schedule_asset.getIdentifier()); 
                   console.log(' Doctor id is ' + schedule_asset.doctor[0].getIdentifier()); 


           }

      });  

}
...