524
564
else if (untypedItem->castToDouble(castItem))
527
found = found || insertInMap(castItem, node2, store::XS_DOUBLE, true);
567
if (insertInMap(castItem, node2, store::XS_DOUBLE, true))
530
571
// try casting to xs:datetime
531
572
else if (untypedItem->castToDateTime(castItem))
534
found = found || insertInMap(castItem, node2, store::XS_DATETIME, true);
575
if (insertInMap(castItem, node2, store::XS_DATETIME, true))
537
579
// try casting to xs:date
538
580
else if (untypedItem->castToDate(castItem))
541
found = found || insertInMap(castItem, node2, store::XS_DATE, true);
583
if (insertInMap(castItem, node2, store::XS_DATE, true))
544
587
// try casting to xs:time
545
588
else if (untypedItem->castToTime(castItem))
548
found = found || insertInMap(castItem, node2, store::XS_TIME, true);
591
if (insertInMap(castItem, node2, store::XS_TIME, true))
551
595
// try casting to xs:gYearMonth
552
596
if (!sorted && untypedItem->castToGYearMonth(castItem))
555
found = found || insertInMap(castItem, node2, store::XS_GYEAR_MONTH, true);
599
if (insertInMap(castItem, node2, store::XS_GYEAR_MONTH, true))
558
603
// try casting to xs:gMonthDay
559
604
else if (!sorted && untypedItem->castToGMonthDay(castItem))
562
found = found || insertInMap(castItem, node2, store::XS_GMONTH_DAY, true);
607
if (insertInMap(castItem, node2, store::XS_GMONTH_DAY, true))
565
611
// try casting to xs:gDay
566
612
else if (!sorted && untypedItem->castToGDay(castItem))
569
found = found || insertInMap(castItem, node2, store::XS_GDAY, true);
615
if (insertInMap(castItem, node2, store::XS_GDAY, true))
572
619
// try casting to xs:gMonth
573
620
else if (!sorted && untypedItem->castToGMonth(castItem))
576
found = found || insertInMap(castItem, node2, store::XS_GMONTH, true);
623
if (insertInMap(castItem, node2, store::XS_GMONTH, true))
579
627
// try casting to xs:duration
580
628
else if (untypedItem->castToDuration(castItem))
583
found = found || insertInMap(castItem, node2, store::XS_DURATION, true);
631
if (insertInMap(castItem, node2, store::XS_DURATION, true))
586
635
// try casting to xs:hexBinary
587
636
else if (!sorted && untypedItem->castToHexBinary(castItem))
590
found = found || insertInMap(castItem, node2, store::XS_HEXBINARY, true);
639
if (insertInMap(castItem, node2, store::XS_HEXBINARY, true))
593
643
// try casting to xs:base64Binary
594
644
else if (!sorted && untypedItem->castToBase64Binary(castItem))
597
found = found || insertInMap(castItem, node2, store::XS_BASE64BINARY, true);
647
if (insertInMap(castItem, node2, store::XS_BASE64BINARY, true))
623
theUntypedFlag = true;
627
GeneralTreeIndex* idx = static_cast<GeneralTreeIndex*>(this);
628
return idx->insertInMap(key, node, idx->theMaps[targetMap], untyped);
632
GeneralHashIndex* idx = static_cast<GeneralHashIndex*>(this);
633
return idx->insertInMap(key, node, idx->theMaps[targetMap], untyped);
674
++theNumUntypedEntries;
678
GeneralTreeIndex* idx = static_cast<GeneralTreeIndex*>(this);
679
return idx->insertInMap(key, node, idx->theMaps[targetMap], untyped);
683
GeneralHashIndex* idx = static_cast<GeneralHashIndex*>(this);
684
return idx->insertInMap(key, node, idx->theMaps[targetMap], untyped);
689
/******************************************************************************
691
*******************************************************************************/
692
bool GeneralIndex::remove(const store::Item_t& key, const store::Item_t& node)
696
store::Item_t castItem;
698
bool sorted = isSorted();
700
AtomicItem* keyItem = static_cast<AtomicItem*>(key.getp());
704
std::vector<store::Item_t>::iterator ite =
705
std::find(theEmptyKeyNodes.begin(), theEmptyKeyNodes.end(), node);
707
ZORBA_ASSERT(ite != theEmptyKeyNodes.end());
709
theEmptyKeyNodes.erase(ite);
713
if (keyItem->getBaseItem() != NULL)
715
keyItem = static_cast<AtomicItem*>(keyItem->getBaseItem());
720
return removeFromMap(key, node, theKeyTypeCode, false);
723
store::SchemaTypeCode keyType = keyItem->getTypeCode();
727
case store::XS_BASE64BINARY:
728
case store::XS_HEXBINARY:
730
case store::XS_QNAME:
731
case store::XS_NOTATION:
733
case store::XS_GYEAR_MONTH:
734
case store::XS_GYEAR:
735
case store::XS_GMONTH_DAY:
737
case store::XS_GMONTH:
743
case store::XS_ANY_URI:
745
case store::XS_BOOLEAN:
747
case store::XS_DATETIME:
751
return removeFromMap(key, node, keyType, false);
754
case store::XS_DURATION:
755
case store::XS_YM_DURATION:
756
case store::XS_DT_DURATION:
758
return removeFromMap(key, node, store::XS_DURATION, false);
761
case store::XS_STRING:
762
case store::XS_NORMALIZED_STRING:
763
case store::XS_TOKEN:
764
case store::XS_NMTOKEN:
765
case store::XS_LANGUAGE:
767
case store::XS_NCNAME:
769
case store::XS_IDREF:
770
case store::XS_ENTITY:
772
return removeFromMap(key, node, store::XS_STRING, false);
775
case store::XS_DOUBLE:
776
case store::XS_FLOAT:
778
return removeFromMap(key, node, store::XS_DOUBLE, false);
781
case store::XS_DECIMAL:
782
case store::XS_INTEGER:
783
case store::XS_NON_POSITIVE_INTEGER:
784
case store::XS_NEGATIVE_INTEGER:
785
case store::XS_NON_NEGATIVE_INTEGER:
786
case store::XS_POSITIVE_INTEGER:
787
case store::XS_UNSIGNED_LONG:
789
// try lossless cast to xs:long
790
keyItem->castToLong(castItem);
792
if (castItem != NULL)
794
keyItem = static_cast<AtomicItem*>(castItem.getp());
798
// Coerce to xs:double
799
keyItem->coerceToDouble(castItem, true, lossy);
801
found = removeFromMap(key, node, store::XS_DOUBLE, false);
805
if (removeFromMap(castItem, node, store::XS_DECIMAL, false))
814
// NOTE: here we use KeyItem, instead of key, as arg to removeFromMap, because
815
// we can reach here from the store::XS_DECIMAL case.
817
xs_long longValue = static_cast<LongItem*>(keyItem)->getLongValue();
819
if (longValue > theMaxLong || longValue < theMinLong)
824
xs_double doubleValue(longValue);
825
GET_FACTORY().createDouble(castItem, doubleValue);
829
keyItem->coerceToDouble(castItem, false, lossy);
835
std::cout << "Lossy LONG insertion in index" << getName()->getStringValue()
837
<< "long value = " << longValue
838
<< " double value = " << castItem->getDoubleValue()
839
<< std::endl << std::endl;
841
found = removeFromMap(keyItem, node, store::XS_LONG, false);
843
if (removeFromMap(castItem, node, store::XS_DOUBLE, false))
848
found = removeFromMap(keyItem, node, store::XS_LONG, false);
853
found = removeFromMap(keyItem, node, store::XS_LONG, false);
860
case store::XS_SHORT:
862
case store::XS_UNSIGNED_INT:
863
case store::XS_UNSIGNED_SHORT:
864
case store::XS_UNSIGNED_BYTE:
866
return removeFromMap(key, node, store::XS_LONG, false);
869
case store::XS_UNTYPED_ATOMIC:
871
store::ItemHandle<UntypedAtomicItem> untypedItem =
872
static_cast<UntypedAtomicItem*>(key.getp());
875
untypedItem->castToString(castItem);
877
found = removeFromMap(castItem, node, store::XS_STRING, false);
879
// try casting to xs:long
880
if (untypedItem->castToLong(castItem))
882
store::ItemHandle<LongItem> longItem = static_cast<LongItem*>(castItem.getp());
884
xs_long longValue = longItem->getLongValue();
886
if (removeFromMap(castItem, node, store::XS_LONG, true))
889
if (longValue > theMaxLong || longValue < theMinLong)
894
xs_double doubleValue(longValue);
895
GET_FACTORY().createDouble(castItem, doubleValue);
899
longItem->coerceToDouble(castItem, false, lossy);
904
if (removeFromMap(castItem, node, store::XS_DOUBLE, true))
909
// may also be gYear, hexBinary, base64Binary, or boolean
912
if (untypedItem->castToGYear(castItem))
914
if (removeFromMap(castItem, node, store::XS_GYEAR, true))
918
if (untypedItem->castToHexBinary(castItem))
920
if (removeFromMap(castItem, node, store::XS_HEXBINARY, true))
924
if (untypedItem->castToBase64Binary(castItem))
926
if (removeFromMap(castItem, node, store::XS_BASE64BINARY, true))
932
// try casting to xs:decimal
933
else if (untypedItem->castToDecimal(castItem))
935
store::ItemHandle<DecimalItem> decimalItem =
936
static_cast<DecimalItem*>(castItem.getp());
938
decimalItem->coerceToDouble(castItem, true, lossy);
940
if (removeFromMap(castItem, node, store::XS_DOUBLE, true))
945
castItem.transfer(decimalItem);
946
if (removeFromMap(castItem, node, store::XS_DECIMAL, true))
950
// may also be hexBinary or base64Binary
953
if (untypedItem->castToHexBinary(castItem))
955
if (removeFromMap(castItem, node, store::XS_HEXBINARY, true))
959
if (untypedItem->castToBase64Binary(castItem))
961
if (removeFromMap(castItem, node, store::XS_BASE64BINARY, true))
967
// try casting to xs:double
968
else if (untypedItem->castToDouble(castItem))
970
if (removeFromMap(castItem, node, store::XS_DOUBLE, true))
974
// try casting to xs:datetime
975
else if (untypedItem->castToDateTime(castItem))
977
if (removeFromMap(castItem, node, store::XS_DATETIME, true))
981
// try casting to xs:date
982
else if (untypedItem->castToDate(castItem))
984
if (removeFromMap(castItem, node, store::XS_DATE, true))
988
// try casting to xs:time
989
else if (untypedItem->castToTime(castItem))
991
if (removeFromMap(castItem, node, store::XS_TIME, true))
995
// try casting to xs:gYearMonth
996
if (!sorted && untypedItem->castToGYearMonth(castItem))
998
if (removeFromMap(castItem, node, store::XS_GYEAR_MONTH, true))
1002
// try casting to xs:gMonthDay
1003
else if (!sorted && untypedItem->castToGMonthDay(castItem))
1005
if (removeFromMap(castItem, node, store::XS_GMONTH_DAY, true))
1009
// try casting to xs:gDay
1010
else if (!sorted && untypedItem->castToGDay(castItem))
1012
if (removeFromMap(castItem, node, store::XS_GDAY, true))
1016
// try casting to xs:gMonth
1017
else if (!sorted && untypedItem->castToGMonth(castItem))
1019
if (removeFromMap(castItem, node, store::XS_GMONTH, true))
1023
// try casting to xs:duration
1024
else if (untypedItem->castToDuration(castItem))
1026
if (removeFromMap(castItem, node, store::XS_DURATION, true))
1030
// try casting to xs:hexBinary
1031
else if (!sorted && untypedItem->castToHexBinary(castItem))
1033
if (removeFromMap(castItem, node, store::XS_HEXBINARY, true))
1037
// try casting to xs:base64Binary
1038
else if (!sorted && untypedItem->castToBase64Binary(castItem))
1040
if (removeFromMap(castItem, node, store::XS_BASE64BINARY, true))
1048
ZORBA_ASSERT(false);
1055
/******************************************************************************
1057
*******************************************************************************/
1058
bool GeneralIndex::remove(
1059
const store::IndexKey* key,
1060
const store::Item_t& node,
1063
ZORBA_ASSERT(false);
1067
/******************************************************************************
1069
*******************************************************************************/
1070
bool GeneralIndex::removeFromMap(
1071
const store::Item_t& key,
1072
const store::Item_t& node,
1073
store::SchemaTypeCode targetMap,
1077
--theNumUntypedEntries;
1081
GeneralTreeIndex* idx = static_cast<GeneralTreeIndex*>(this);
1082
return idx->removeFromMap(key, node, idx->theMaps[targetMap]);
1086
GeneralHashIndex* idx = static_cast<GeneralHashIndex*>(this);
1087
return idx->removeFromMap(key, node, idx->theMaps[targetMap]);