int IndexComparator::compare()

in src/cas/lowlevel_indexcomparator.cpp [166:300]


    int IndexComparator::compare(uima::lowlevel::FSHeap const & heap, TyFS fs1, TyFS fs2) const {
      if (fs1 == fs2) {
        return 0;
      }
      assert( heap.getTypeSystem().subsumes( iv_tyType, heap.getType(fs1)) );
      assert( heap.getTypeSystem().subsumes( iv_tyType, heap.getType(fs2)) );
      UIMA_TPRINT("Comparing fs of type " << heap.getTypeSystem().getTypeName( heap.getType(fs1)));
      UIMA_TPRINT("   with fs of type " << heap.getTypeSystem().getTypeName( heap.getType(fs2)));
      bool isGreater = false;
      bool isLess = false;
      size_t i;
      const size_t uiOffsetsSize = iv_offsets.size();
      TyFeatureOffset utCurrentOffset;
      // for each feature
      for (i=0; i <uiOffsetsSize; ++i) {
        UIMA_TPRINT("Comparing feature " << i);
        utCurrentOffset = iv_offsets[i];
        // if type priority
        if (utCurrentOffset == 0) {
          assert( iv_features[i] == uima::lowlevel::TypeSystem::INVALID_FEATURE );

          uima::lowlevel::TyFSType t1 = heap.getType(fs1);
          uima::lowlevel::TyFSType t2 = heap.getType(fs2);

          uima::lowlevel::TypeSystem const & crTypeSystem = heap.getTypeSystem();
          if (t1 == t2) {
            isLess = false;
            isGreater = false;
          } else if (crTypeSystem.hasPriorityOver(t1, t2)) {
            isLess = true;
            isGreater = false;
          } else {
            isLess = false;
            isGreater = true;
          }
        } else {
          TyFS val1 = heap.getFeatureWithOffset(fs1, utCurrentOffset);
          TyFS val2 = heap.getFeatureWithOffset(fs2, utCurrentOffset);
          switch (iv_appropTypes[i]) {
          case BUILTIN_TYPE_INTEGER: {
            int i1 = FSHeap::getFSAsInt(val1);
            int i2 = FSHeap::getFSAsInt(val2);
            UIMA_TPRINT("  val1: " << i1 << ", val2: " << i2);
            isLess = (i1 < i2);
            isGreater = (i1 > i2);
            break;
          }
          case BUILTIN_TYPE_FLOAT: {
            float f1 = FSHeap::getFSAsFloat(val1);
            float f2 = FSHeap::getFSAsFloat(val2);
            isLess = (f1 < f2);
            isGreater = (f1 > f2);
            break;
          }
          case BUILTIN_TYPE_STRING: {
            UnicodeStringRef us1 = heap.getFSAsString(val1);
            UnicodeStringRef us2 = heap.getFSAsString(val2);
            int iCmp = inline_strCompare(us1.getBuffer(), us1.length(),
                                         us2.getBuffer(), us2.length());
            isLess    = (iCmp < 0);
            isGreater = (iCmp > 0);
            break;
          }
          case BUILTIN_TYPE_BOOLEAN: {
            bool f1 = FSHeap::getFSAsBoolean(val1);
            bool f2 =  FSHeap::getFSAsBoolean(val2);
            isLess = (f1 < f2);
            isGreater = (f1 > f2);
            break;
          }
          case BUILTIN_TYPE_BYTE: {
            char f1 = FSHeap::getFSAsByte(val1);
            char f2 =  FSHeap::getFSAsByte(val2);
            isLess = (f1 < f2);
            isGreater = (f1 > f2);
            break;
          }
          case BUILTIN_TYPE_SHORT: {
            short f1 = FSHeap::getFSAsShort(val1);
            short f2 = FSHeap::getFSAsShort(val2);
            isLess = (f1 < f2);
            isGreater = (f1 > f2);
            break;
          }
          case BUILTIN_TYPE_LONG: {
            INT64 f1 = heap.getFSAsLong(val1);
            INT64 f2 = heap.getFSAsLong(val2);
            isLess = (f1 < f2);
            isGreater = (f1 > f2);
            break;
          }
          case BUILTIN_TYPE_DOUBLE: {
            double f1 = heap.getFSAsDouble(val1);
            double f2 = heap.getFSAsDouble(val2);
            isLess = (f1 < f2);
            isGreater = (f1 > f2);
            break;
          }

          default:
//                  UIMA_TPRINT("Unsupported type: " << heap.getTypeSystem().getTypeName(appropTypes[i]));
            assertWithMsg(false, "Unsupported built-in type");
          }
        }
        UIMA_TPRINT("   isLess: " << isLess);
        UIMA_TPRINT("   isGreater: " << isGreater);
        assert( ! (isLess && isGreater) );

        switch (iv_comparators[i]) {
        case STANDARD_COMPARE: {
          if (isLess) {
            return 1;
          } else {
            if (isGreater) {
              return -1;
            }
          }
          break;
        }
        case REVERSE_STANDARD_COMPARE: {
          if (isLess) {
            return -1;
          } else {
            if (isGreater) {
              return 1;
            }
          }
          break;
        }
        default:
          assert(false);
        };
      }
      return 0;
    }