Unfortunately, my first attempt to rewrite your code seems to trigger
an interpreter bug.

For reference, here's my attempt:

getIf=: 4 :0
  if. data=: ".x
      n=: #y
      idx=: (n{."1 data) i. y
      3 < idx getCtCol data
  do. x; idx getValCol data end.
)

getVal =: 3 : 0
  NB. search for the full key in city_sport (e.g. hat;chicago;baseball
  if. ret=: 'city_sport' getIf y  do. ret return. end.
  NB. search for city
  if. ret=: 'city' getIf 2 {. y   do. ret return. end.
  NB. search for sport, meaning we need the 1st and 3rd value from the key
  if. ret=: 'sport' getIf 0 2 { y do. ret return. end.
  NB. search for item overall
  if. ret=: 'item' getIf 0 { y    do. ret return. end.
  ''
)

What seems to happen is that only the city_sport table gets tested,
even with empty ret values from that lookup.

This violates the dictionary definition for if.

I guess this means that I'm going to need to go in and find why this
is happening (unless someone else gets to it before me).

Thanks,

-- 
Raul


On Sat, Oct 3, 2015 at 8:45 AM, Joe Bogner <[email protected]> wrote:
> I'm working on an app that needs a function to return a value based upon
> matching to 4 different sources and returns the most specific match that
> meets a quality threshold.
>
> Here is an example:
>
> The last column of every table (e.g. city_sport) indicates the quality
> threshold and the column before that is the value I'd like if the quality
> threshold is above 3
>
> The logic in words:
>
> Search city_sport
> if not found or quality not sufficient, search city
> if not found or quality not sufficient search sport
> if not found or quality not sufficient search item
>
> The logic works. I wrote it quickly in J using my natural imperative
> mindset. I then was able to very quickly translate it into C# (probably
> demonstrating how imperative my mindset was)
>
> J version: https://gist.github.com/joebo/381552e6ad106391e128
> C# version: https://gist.github.com/joebo/a0ff7eb57ee15ea96c61
>
> I'm looking for input on how to rewrite getVal to show improved
> maintenance, conciseness over the C# version (subjective, I know)
>
> Some half-baked thoughts:
>
> 1. Instead of using the if., at each step build up all the possible results
> and find the result in the final step
>
> Note: this will be searching a table of 180,000 rows so performance may
> matter. The current J version doesn't short circuit, but it could fairly
> easily
>
> 2. Some trick with agenda
>
>
> Thanks for any input
>
> Code below:
>
> city_sport=: ' ' cut every <;._2 (0 : 0)
> hat chicago baseball 1 5
> hat chicago football 2 5
> hat atlanta baseball 3 2
> hat orlando football 3 3
> glove orlando baseball 3 3
> )
>
> city=: ' ' cut every <;._2 (0 : 0)
> hat chicago 1 5
> hat atlanta 3 2
> hat orlando 3 3
> glove orlando 3 3
> )
>
> sport=: ' ' cut every <;._2 (0 : 0)
> hat baseball 1 5
> hat football 3 2
> jersey soccer 3 4
> )
>
> item=: ' ' cut every <;._2 (0 : 0)
> hat 1 5
> jersey 2 4
> )
>
> NB. gets the count which is always the last column
> getCtCol =: ([: ". [: > _1 { {) :: 0:
>
> NB. gets the value which is always 2nd to last column
> getValCol =: ([: ". [: > _2 { {) :: 0:
>
> getVal =: 3 : 0
>   NB. search for the full key in city_sport (e.g. hat;chicago;baseball
>   idx =: 0 { (3{."1 city_sport) i. (,: y)
>   ret=:''
>   if. (idx getCtCol city_sport) > 3 do.
>       ret =: 'city_sport';(idx getValCol city_sport)
>   end.
>   NB. search for city
>   idx =: 0 { (2{."1 city) i. (,: 2{."1 y)
>   if. (0 = (#ret)) *. (idx getCtCol city) > 3 do.
>       ret =: 'city';(idx getValCol city)
>   end.
>   NB. search for sport, meaning we need the 1st and 3rd value from the key
>   idx =: 0 { (2{."1 sport) i. (,: 0 2 { y)
>   if. (0 = (#ret)) *. (idx getCtCol sport) > 3 do.
>       ret =: 'sport';(idx getValCol sport)
>   end.
>   NB. search for item overall
>   idx =: 0 { (1{."1 item) i. (,: 0 { y)
>   if. (0 = (#ret)) *. (idx getCtCol item) > 3 do.
>       ret =: 'item';(idx getValCol item)
>   end.
>   ret
> )
>
> smoutput getVal 'hat';'chicago';'baseball'
> smoutput getVal 'hat';'chicago';'hockey'
> smoutput getVal 'jersey';'chicago';'soccer'
> smoutput getVal 'jersey';'chicago';'badmitton'
>
> NB. not enough hats in the city/sport match or city match
> smoutput getVal 'hat';'atlanta';'baseball'
>
>
> Outputs:
>
>    smoutput getVal 'hat';'chicago';'baseball'
>
> ┌──────────┬─┐
>
> │city_sport│1│
>
> └──────────┴─┘
>
> smoutput getVal 'hat';'chicago';'hockey'
>
> ┌────┬─┐
>
> │city│1│
>
> └────┴─┘
>
> smoutput getVal 'jersey';'chicago';'soccer'
>
> ┌─────┬─┐
>
> │sport│3│
>
> └─────┴─┘
>
> smoutput getVal 'jersey';'chicago';'badmitton'
>
> ┌────┬─┐
>
> │item│2│
>
> └────┴─┘
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to