int32_t SegmentMerger::mergeFields()
{
    //Func - Merge the fields of all segments 
    //Pre  - true
    //Post - The field infos and field values of all segments have been merged.

    //Create a new FieldInfos
    fieldInfos = _CLNEW FieldInfos();		  // merge field names

    //Condition check to see if fieldInfos points to a valid instance
    CND_CONDITION(fieldInfos != NULL, "Memory allocation for fieldInfos failed");

    IndexReader* reader = NULL;

    int32_t docCount = 0;

    //Iterate through all readers
    for (uint32_t i = 0; i < readers.size(); i++) {
        //get the i-th reader
        reader = readers[i];
        //Condition check to see if reader points to a valid instance
        CND_CONDITION(reader != NULL,"No IndexReader found");

        StringArrayWithDeletor tmp;

        tmp.clear();
        reader->getFieldNames(IndexReader::TERMVECTOR_WITH_POSITION_OFFSET, tmp);
        addIndexed(reader, fieldInfos, tmp, true, true, true);

        tmp.clear();
        reader->getFieldNames(IndexReader::TERMVECTOR_WITH_POSITION, tmp);
        addIndexed(reader, fieldInfos, tmp, true, true, false);

        tmp.clear();
        reader->getFieldNames(IndexReader::TERMVECTOR_WITH_OFFSET, tmp);
        addIndexed(reader, fieldInfos, tmp, true, false, true);

        tmp.clear();
        reader->getFieldNames(IndexReader::TERMVECTOR, tmp);
        addIndexed(reader, fieldInfos, tmp, true, false, false);

        tmp.clear();
        reader->getFieldNames(IndexReader::INDEXED, tmp);
        addIndexed(reader, fieldInfos, tmp, false, false, false);

        tmp.clear();
        reader->getFieldNames(IndexReader::UNINDEXED, tmp);
        if (tmp.size() > 0) {
            TCHAR** arr = _CL_NEWARRAY(TCHAR*,tmp.size()+1);
            tmp.toArray(arr);
            fieldInfos->add((const TCHAR**)arr, false);
            _CLDELETE_ARRAY(arr);
            //no need to delete the contents, since tmp is responsible for it
        }
    }
int32_t SegmentMerger::mergeFields() {
//Func - Merge the fields of all segments
//Pre  - true
//Post - The field infos and field values of all segments have been merged.

  if (!mergeDocStores) {
    // When we are not merging by doc stores, that means
    // all segments were written as part of a single
    // autoCommit=false IndexWriter session, so their field
    // name -> number mapping are the same.  So, we start
    // with the fieldInfos of the last segment in this
    // case, to keep that numbering.
    assert(readers[readers.size()-1]->instanceOf(SegmentReader::getClassName()));
    assert(false);//check last...and remove if correct...
    SegmentReader* sr = (SegmentReader*)readers[readers.size()-1];
    fieldInfos = sr->fieldInfos()->clone();
  } else {
    //Create a new FieldInfos
    fieldInfos = _CLNEW FieldInfos();		  // merge field names
  }
	//Condition check to see if fieldInfos points to a valid instance
	CND_CONDITION(fieldInfos != NULL,"Memory allocation for fieldInfos failed");

	IndexReader* reader = NULL;

  //Iterate through all readers
  for (uint32_t i = 0; i < readers.size(); i++){
	  //get the i-th reader
	  reader = readers[i];
	  //Condition check to see if reader points to a valid instance
	  CND_CONDITION(reader != NULL,"No IndexReader found");

    if (reader->instanceOf(SegmentReader::getClassName())) {
      SegmentReader* segmentReader = (SegmentReader*) reader;
      for (size_t j = 0; j < segmentReader->getFieldInfos()->size(); j++) {
        FieldInfo* fi = segmentReader->getFieldInfos()->fieldInfo(j);
        fieldInfos->add(fi->name, fi->isIndexed, fi->storeTermVector,
          fi->storePositionWithTermVector, fi->storeOffsetWithTermVector,
          !reader->hasNorms(fi->name), fi->storePayloads);
      }
    } else {
	    StringArrayWithDeletor tmp;

	    tmp.clear(); reader->getFieldNames(IndexReader::TERMVECTOR_WITH_POSITION_OFFSET, tmp);
	    addIndexed(reader, fieldInfos, tmp, true, true, true, false);

	    tmp.clear(); reader->getFieldNames(IndexReader::TERMVECTOR_WITH_POSITION, tmp);
	    addIndexed(reader, fieldInfos, tmp, true, true, false, false);

	    tmp.clear(); reader->getFieldNames(IndexReader::TERMVECTOR_WITH_OFFSET, tmp);
	    addIndexed(reader, fieldInfos, tmp, true, false, true, false);

	    tmp.clear(); reader->getFieldNames(IndexReader::TERMVECTOR, tmp);
	    addIndexed(reader, fieldInfos, tmp, true, false, false, false);

	    tmp.clear(); reader->getFieldNames(IndexReader::STORES_PAYLOADS, tmp);
	    addIndexed(reader, fieldInfos, tmp, false, false, false, true);

	    tmp.clear(); reader->getFieldNames(IndexReader::INDEXED, tmp);
	    addIndexed(reader, fieldInfos, tmp, false, false, false, false);

	    tmp.clear(); reader->getFieldNames(IndexReader::UNINDEXED, tmp);
	    if ( tmp.size() > 0 ){
		    TCHAR** arr = _CL_NEWARRAY(TCHAR*,tmp.size()+1);
            tmp.toArray_nullTerminated(arr);
		    fieldInfos->add((const TCHAR**)arr, false);
		    _CLDELETE_ARRAY(arr); //no need to delete the contents, since tmp is responsible for it
	    }
    }
  }
Beispiel #3
0
int main()
{
    Node * head = NULL;
    FILE * fin = NULL;

    fin = openFile();

    createWordNodes(fin,&head);


    printf("\n\n-----------Printing Original List-----------\n\n");
    printList(head);
    printf("\n\n\nBREAK\n\n\n");

    char temp[6] = "frank";
    Word * tempWord = createWordStruct(temp);

    addOrdered(tempWord, &head);
    printf("\n\n-----------Printing List Adding Ordered the name \"frank\"-----------\n\n");
    printList(head);
    printf("\n\n\nBREAK\n\n\n");

    char temp1[6] = "AAAAA";
    tempWord = createWordStruct(temp1);

    addFirst(tempWord, &head);
    printf("\n\n-----------Printing List Adding First the word \"AAAAA\"-----------\n\n");
    printList(head);
    printf("\n\n\nBREAK\n\n\n");

    char temp2[6] = "ZZZZZ";
    tempWord = createWordStruct(temp2);

    addLast(tempWord, &head);
    printf("\n\n-----------Printing List Adding Last the word \"ZZZZZ\"-----------\n\n");
    printList(head);
    printf("\n\n\nBREAK\n\n\n");

    char temp3[6] = "XXXXX";
    tempWord = createWordStruct(temp3);

    addIndexed(tempWord, &head, 2);
    char prevWord[MAX], postWord[MAX];
    strcpy(prevWord,((Word*)(head->next->data))->wrd);
    strcpy(postWord,((Word*)(head->next->next->next->data))->wrd);


    printf("\n\n-----------Printing List Adding at Index #2 the word \"XXXXX\"-----------\n\n");
    printf("\n\n-----------It should be between the words \"%s\" and \"%s\"-----------\n\n", prevWord, postWord);
    printList(head);
    printf("\n\n\nBREAK\n\n\n");

    removeFirst(&head);
    printf("\n\n-----------Printing List Removing First which will be the word \"AAAAA\"-----------\n\n");
    printList(head);
    printf("\n\n\nBREAK\n\n\n");

    removeLast(&head);
    printf("\n\n-----------Printing List Removing Last which will be the word \"ZZZZZ\"-----------\n\n");
    printList(head);
    printf("\n\n\nBREAK\n\n\n");

    printf("\n\n-----------Attempting to remove at index out of bounds-----------\n\n");
    removeIndex(&head,-30);

    char word2Remove[MAX];
    strcpy(word2Remove,((Word*)(head->next->next->data))->wrd);

    printf("\n\n-----------Attempting to remove at index 2 which will be: \"%s\"-----------\n\n", word2Remove);
    removeIndex(&head, 2);


    printf("\n\n-----------Printing list having removed %s-----------\n\n", word2Remove);
    printList(head);
    printf("\n\n\nBREAK\n\n\n");



    printf("\n\n-----------Clearing (freeing) the entire list-----------\n\n");
    clearList(&head);

    printf("\n\n-----------Attempting to print empty list-----------\n\n");
    printList(head);
    printf("\n\n\nBREAK\n\n\n");

    printf("\n\n-----------GOODBYE-----------\n\n");

    fclose(fin);
	return 0;

}// end main