Guest User

500px

a guest
Mar 7th, 2014
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Read down for what it does.
  2. var laveshtien_strings = [
  3.   "Photos in $in",
  4.   "Photos near $in",
  5.   "Photos by $user",
  6.   "Photos tagged $tag",
  7.   "Sort by $",
  8.   "$term"
  9. ];
  10.  
  11. // DONT EVEN ASK ITS PORTED FROM SOME CODE
  12. // WHICH WAS IN THIS FORM already :-(
  13. function levDist(s, t) {
  14.     var d = []; //2d matrix
  15.  
  16.     // Step 1
  17.     var n = s.length;
  18.     var m = t.length;
  19.  
  20.     if (n == 0) return m;
  21.     if (m == 0) return n;
  22.  
  23.     //Create an array of arrays in javascript (a descending loop is quicker)
  24.     for (var i = n; i >= 0; i--) d[i] = [];
  25.  
  26.     // Step 2
  27.     for (var i = n; i >= 0; i--) d[i][0] = i;
  28.     for (var j = m; j >= 0; j--) d[0][j] = j;
  29.  
  30.     // Step 3
  31.     for (var i = 1; i <= n; i++) {
  32.         var s_i = s.charAt(i - 1);
  33.  
  34.         // Step 4
  35.         for (var j = 1; j <= m; j++) {
  36.  
  37.             //Check the jagged ld total so far
  38.             if (i == j && d[i][j] > 4) return n;
  39.  
  40.             var t_j = t.charAt(j - 1);
  41.             var cost = (s_i == t_j) ? 0 : 1; // Step 5
  42.  
  43.             //Calculate the minimum
  44.             var mi = d[i - 1][j] + 1;
  45.             var b = d[i][j - 1] + 1;
  46.             var c = d[i - 1][j - 1] + cost;
  47.  
  48.             if (b < mi) mi = b;
  49.             if (c < mi) mi = c;
  50.  
  51.             d[i][j] = mi; // Step 6
  52.  
  53.             //Damerau transposition
  54.             if (i > 1 && j > 1 && s_i == t.charAt(j - 2) && s.charAt(i - 2) == t_j) {
  55.                 d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + cost);
  56.             }
  57.         }
  58.     }
  59.  
  60.     // Step 7
  61.     return d[n][m];
  62. }
  63.  
  64. // So the other person wants to write code once in a while
  65. // but reads most of it
  66. // just to make sure she doesn't calls me asking whats going on in here
  67. // wrote this amazing name
  68. // Gotta love sublime for autoType
  69. function removePossibleKeywordsAndCalculateLevDistanceUsing(lavQueryString, searchString){
  70.  
  71.   var tokens = lavQueryString.split(" "),
  72.   inputWordArray = searchString.split(" "),
  73.   tokensInputString = {},
  74.   token = '',
  75.   output = {
  76.     score: Infinity,
  77.     tokens:{}
  78.   },
  79.   shouldWeCallTheLev = true;
  80.  
  81.   for( var i = 0; i < tokens.length; i++ ){
  82.    
  83.     if( inputWordArray.length < tokens.length ){      
  84.       shouldWeCallTheLev = false;
  85.       break;
  86.     }
  87.  
  88.     if( tokens[i].indexOf("$") === -1){
  89.       continue;
  90.     }
  91.    
  92.     token = tokens[i].replace("$","");
  93.     output.tokens[token] = inputWordArray[i];
  94.     tokens[i] = inputWordArray[i] = '';
  95.  
  96.   }
  97.   if( shouldWeCallTheLev ){
  98.    output.score = levDist( tokens.join(" "), inputWordArray.join(" "));
  99.   }
  100.  
  101.   return output;
  102. }
  103.  
  104. function getBestLavMatch(string){
  105.   var results = laveshtien_strings.map(function(lav){
  106.     return removePossibleKeywordsAndCalculateLevDistanceUsing(lav, string);
  107.   });
  108.  
  109.   results = results.sort(function(a, b){
  110.     return a.score - b.score;
  111.   });
  112.  
  113.   return results[0];
  114. }
  115.  
  116.  
  117. // path search
  118. exports.search = function(req, res, next){
  119.   if( req.service.allowsSearch === false){
  120.     return res.json({
  121.       status_code: 403,
  122.       message: "Method Not Supported for this service",
  123.     });
  124.   }
  125.  
  126.   var lavResult = getBestLavMatch(req.query.q);
  127.  
  128.   if( levResult && levResult.score < 5 ){  
  129.     service.search(levResult.tokens).done(function(snResult){
  130.       res.json({
  131.         status_code: 200,
  132.         message: 'Ok',
  133.         data: snResult
  134.       });
  135.     }).fail(errorResponder(res));
  136.  
  137.     return;
  138.   }
  139.  
  140.   // Implement suggestions here
  141.   next ();
  142. }
  143.  
  144.  
  145. /// Read but didn't understood whats happening ?
  146. // Takes strings like Photos in Jabalpur, etc
  147. // Makes a kvp of them that i call later
  148. // Dirty deeds done dirt cheap
Advertisement
Add Comment
Please, Sign In to add comment