乐趣区

修改forge-search方法加入完全匹配标记解决搜索是模糊搜索问题

viewer3d.js
15194 行

/**
 * 修改 2019-8-6 加入 perfectMatch 关键字,* perfectMatch 为 true 时为完全匹配,为 false 时为包含
 * 
 */
Model.prototype.search = function (text, onSuccessCallback, onErrorCallback, attributeNames,perfectMatch)
{var pdb = this.getPropertyDb();

  if (!pdb) {onErrorCallback && onErrorCallback();
    return;
  }

  pdb.searchProperties(text, attributeNames, onSuccessCallback, onErrorCallback,perfectMatch);
};

19173 行

/**
 * 修改 2019-8-6 加入 perfectMatch 关键字,* perfectMatch 为 true 时为完全匹配,为 false 时为包含
 *
 */

Viewer3D.prototype.search = function (text, onSuccessCallback, onErrorCallback, attributeNames,perfectMatch)
{
  this.searchText = text;

  if (this.model) {this.model.search(text, onSuccessCallback, onErrorCallback, attributeNames,perfectMatch);
  } else
  {if (onErrorCallback)
    onErrorCallback(_file_loaders_net_ErrorCodes__WEBPACK_IMPORTED_MODULE_6__["ErrorCodes"].BAD_DATA, "Search failed since model does not exist");
  }
};

38881 行

/**
 * 修改 2019-8-6 加入 perfectMatch 关键字,* perfectMatch 为 true 时为完全匹配,为 false 时为包含
 *
 */
PropDbLoader.prototype.searchProperties = function (searchText, attributeNames, onSuccess, onError,perfectMatch) {

  this.asyncPropertyOperation(
  {
    "operation": WORKER_SEARCH_PROPERTIES,
    "searchText": searchText,
    "attributeNames": attributeNames,
      "perfectMatch":perfectMatch
  },

  onSuccess, onError);

};

lmvworker.js
35941 行

/**
 * 修改 2019-8-6 加入 perfectMatch 关键字,* perfectMatch 为 true 时为完全匹配,为 false 时为包含
 * @param loadContext
 */

function doPropertySearch(loadContext) {

  var _this = loadContext.worker;
  // 添加
  var perfectMatch = loadContext.perfectMatch;
  var cacheEntry = _this.pdbCache && _this.pdbCache[loadContext.dbPath];

  if (cacheEntry && cacheEntry.pdb) {
    var searchText = loadContext.searchText;
    var result = cacheEntry.pdb.bruteForceSearch(searchText, loadContext.attributeNames,perfectMatch);
    _this.postMessage({cbId: loadContext.cbId, result: result});
  }

}

22754 行

  /**
      * Searches the property database for a string.
      * 修改 2019-8-6 加入 perfectMatch 关键字,* perfectMatch 为 true 时为完全匹配,为 false 时为包含
      *
      * 
      * @returns Array of ids.
      */
  this.bruteForceSearch = function (searchText, attributeNames,perfectMatch) {var searchList = this.getSearchTerms(searchText);

    if (searchList.length === 0)
    return [];

    //For each search word, find matching IDs
    var results = [];

    for (var k = 0; k < searchList.length; k++) {var result = [];

      //Find all values that match the search text
      var matching_vals = [];
      for (var i = 0, iEnd = _valuesOffsets.length; i < iEnd; i++) {var val = this.getValueAt(i);
        if (val === null)
        continue;

        // 原方法
          // if (val.toString().toLowerCase().indexOf(searchList[k]) !== -1){
          //
          //     matching_vals.push(i);
          // }

        // 此处修改
        if(perfectMatch){if (val.toString().toLowerCase() === searchList[k] ){matching_vals.push(i);
            }
        }else{if (val.toString().toLowerCase().indexOf(searchList[k]) !== -1){matching_vals.push(i);
            }
        }


      }

      if (matching_vals.length === 0) {results.push(result);
        continue;
      }

      // values should be sorted at this point, but it doesn't hurt making sure they are.
      matching_vals.sort(function (a, b) {return a - b;});

      this.enumObjects(function (id) {_this.enumObjectProperties(id, function (attrId, valId) {

          // skip hidden attributes
          var isHidden = _this.attributeHidden(attrId);
          if (isHidden) {return;}

          var iFound = Object(_common_SearchUtils__WEBPACK_IMPORTED_MODULE_1__["binarySearch"])(matching_vals, valId);

          if (iFound !== -1) {

            //Check attribute name in case a restriction is passed in
            if (attributeNames && attributeNames.length && attributeNames.indexOf(_attrs[attrId][0]) === -1)
            return;

            result.push(id);
            return true;
          }
        });

      });

      results.push(result);
    }

    if (results.length === 1) {return results[0];
    }

    //If each search term resulted in hits, compute the intersection of the sets
    var map = {};
    var hits = results[0];
    for (var i = 0; i < hits.length; i++) {map[hits[i]] = 1;}


    for (var j = 1; j < results.length; j++) {hits = results[j];
      var mapint = {};

      for (var i = 0; i < hits.length; i++) {if (map[hits[i]] === 1)
        mapint[hits[i]] = 1;
      }

      map = mapint;
    }

    var result = [];
    for (var k in map) {result.push(parseInt(k));
    }

    return result;
  };
退出移动版