====================================================================================================

## Take a copy that is 1/20th the size of ArtistArtist. 
Acopy <- setkey(ArtistArtist[sample(nrow(ArtistArtist), nrow(ArtistArtist) / 20)], Art1, Art2)


##
## OLD IS VERY SLOW, RELATIVELY
#    Old <- quote({
#            Acopy[,
#              {
#                .bys <- c(.BY[[1]], .BY[[2]])         
#                NumberOfSharedFans    <- nrow(DB.using[.(.bys), .N, by=customerid][N != 1] )
#                TotalFans.Per.Artists <- DB.using[.(.bys), lunique(customerid)][["V1"]]
#
#                list( Weight.CumFanPercentage = 2 * NumberOfSharedFans / (TotalFans.Per.Artists[[1L]] + TotalFans.Per.Artists[[2L]])
#                    , NumberOfSharedFans      = NumberOfSharedFans
#                  ) 
#
#              }
#            , by=c("Art1", "Art2")]
#        })

    New <- quote({
            Acopy[,
              {
                # .bys     <- c(.BY[[1]], .BY[[2]]) 
                filtered <- DB.using[.( c(.BY[[1]], .BY[[2]]) ), customerid]
                NumberOfSharedFans    <- filtered[, .N, by=customerid][N!=1, .N]
                TotalFans.Per.Artists <- filtered[, .N, by=artistname][["N"]]
                
                list( Weight.CumFanPercentage = 2 * NumberOfSharedFans / (TotalFans.Per.Artists[[1L]] + TotalFans.Per.Artists[[2L]])
                    , NumberOfSharedFans      = NumberOfSharedFans
                  ) 
              }
            , by=c("Art1", "Art2")]
        })

    Newer <- quote({
            Acopy[,
              {
                # .bys     <- c(.BY[[1]], .BY[[2]]) 
                filtered <- DB.using[.( c(.BY[[1]], .BY[[2]]) ), customerid]

                NumberOfSharedFans    <- sum(duplicated(filtered[["customerid"]]))
                TotalFans.Per.Artists <- filtered[, .N, by=artistname][["N"]]
      
                list( Weight.CumFanPercentage = 2 * NumberOfSharedFans / (TotalFans.Per.Artists[[1L]] + TotalFans.Per.Artists[[2L]])
                    , NumberOfSharedFans      = NumberOfSharedFans
                  )
              }
            , by=c("Art1", "Art2")]
        })

    Newest <- quote({
            Acopy[,
                DB.using[.( c(.BY[[1]], .BY[[2]]) ),  list(customerid, A.NumberOfUniqFans) ][ 
                      ##  need to watch out for by-without-by, since we want to calculate duplicated customerid's ACROSS the groups
                  , {
                      NumberOfSharedFans <- sum(duplicated(customerid))
                      # return
                      list( Weight.CumFanPercentage = (2 * NumberOfSharedFans) / (A.NumberOfUniqFans[[1L]] + A.NumberOfUniqFans[[.N]])
                          , NumberOfSharedFans      = NumberOfSharedFans
                          )
                    }] # //closes DB.using
              
            , by=c("Art1", "Art2")]
        })

    NewerUpdated <-  quote({
            Acopy[,
              {
                # .bys     <- c(.BY[[1]], .BY[[2]]) 
                filtered <- DB.using[.( c(.BY[[1]], .BY[[2]]) ), list(customerid, A.NumberOfUniqFans)]

                NumberOfSharedFans    <- sum(duplicated(filtered[["customerid"]]))
                TotalFans.Per.Artists <- filtered[["A.NumberOfUniqFans"]]
                TotalFans.Per.Artists <- TotalFans.Per.Artists[c(1, length(TotalFans.Per.Artists))]
      
               list( Weight.CumFanPercentage = 2 * NumberOfSharedFans / (TotalFans.Per.Artists[[1L]] + TotalFans.Per.Artists[[2L]])
                   , NumberOfSharedFans      = NumberOfSharedFans
                  )
              }
            , by=c("Art1", "Art2")]
        })


.us()

====================================================================================================


## This was for nrow(Acopy) having about 3K rows


## SMALL 
Acopy <- ArtistArtist[c(1:1000, 130000+(1:1000))]
identical(eval(NewerUpdated), eval(Newer))
identical(eval(NewerUpdated), eval(New))
mbench(New, Newer, Newest, NewerUpdated, times=4L)

## Take a copy that is 1/20th the size of ArtistArtist. 
Acopy <- setkey(ArtistArtist[sample(nrow(ArtistArtist), nrow(ArtistArtist) / 20)], Art1, Art2)


res <- mbench(New, Newer, Newest, NewerUpdated, times=4L)
40 * 4 * 4 / 60

                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~             
                                       RESULTS:                                  
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~             
                                                                                 
                                                                                 
       Measuring 'elapsed' time.                                                 
       Units: seconds                                  Number of Repetitions: 9  
                                                                                 
          Expr        relative      Median Time       MAD      (2xMAD)/Median    
      -------------|-------------|----------------|---------|------------------- 
         Newer            1            11.11         0.08           1.4 %        
         Newest        1.0099          11.22         0.07           1.2 %        
         New            1.64           18.26         0.12           1.3 %        


====================================================================================================


                         Microbenchmark will run 4 times


                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                          RESULTS:
                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


       Measuring 'elapsed' time.
       Units: seconds                                         Number of Repetitions: 4

             Expr           relative      Median Time       MAD       (2xMAD)/Median
      -------------------|-------------|----------------|----------|-------------------
         NewerUpdated           1            364.08         1.78           1.0 %
                Newer         1.45           528.67        36.55          13.8 %
               Newest         1.52           552.23        21.02           7.6 %
                  New          2.4           885.47        141.5          32.0 %

====================================================================================================




