Предоставление значения по умолчанию для левых внешних соединений

Мне было интересно, как лучше всего указать значение по умолчанию при выполнении внешнего соединения в cascalog для поля, которое может быть нулевым.

 (def example-query
    (<- [?id ?fname ?lname !days-active]
        (users :> ?id ?fname ?lname)
        (active :> ?fname ?lname !days-active))

В этом примере пользователи и активные будут ранее определенными запросами, и я просто пытаюсь сопоставить информацию об активном пользователе (?fname ?lname !days-active) и информацию об обычном пользователе (?id ?fname ?lname)

Поэтому, когда произошло соединение, если не было соответствующей информации для !days-active, оно вывело бы 0 вместо nil, т.е.

392393 john smith 3
003030 jane doe 0

вместо

392393 john smith 3
003030 jane doe null

Обновленный пример

(<- [!!database-id ?feature !!user-clicks !!engaged-users ?application-id ?active-users]
                     (app-id-db-id-feature-clicks-engaged :> ?application-id !!database-id ?feature !!user-clicks !!engaged-users )
                     (user-info :> ?application-id ?feature ?active-users))]

вывод примера будет выглядеть примерно так

4234 search null null 222 5000
3232 profile 500 400 331 6000

с фильтрацией, которая меня интересует, я мог бы изменить поля, которые будут !! engaged-users и !! user-clicks, чтобы иметь 0 вместо нуля. Будет ли работать использование нескольких предикатов Or?


person mcgeep    schedule 23.09.2013    source источник


Ответы (1)


Я думаю, что вы хотите сделать, это добавить предикат or:

(def example-query
   (<- [?id ?fname ?lname !days-active]
       (users :> ?id ?fname ?lname)
       (active :> ?fname ?lname !days-active)
       (or !days-active 0 :> ?active-days)))

Между прочим, это не внешнее соединение, оно просто не отфильтровывает нулевые переменные в позиции !days-active.

person Sam Ritchie    schedule 23.09.2013
comment
Я обновил пример, чтобы он был более информативным/приближенным к моей реальной проблеме. Будете ли вы использовать предикат или по-прежнему работать? - person mcgeep; 23.09.2013
comment
Да, и я уверен, что вы могли бы написать макрос предиката, который расширялся бы и позволял вам делать это в одной строке. Должно быть хорошо идти. - person Sam Ritchie; 23.09.2013
comment
Спасибо за помощь! - person mcgeep; 24.09.2013