blob: 00662526d509086072a07bfaf8bfbd714ff1ff79 [file] [log] [blame]
/*------------------------------------------------------------------------------
* Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team
*
* Distributable under the terms of either the Apache License (Version 2.0) or
* the GNU Lesser General Public License, as specified in the COPYING file.
*
* Changes are Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
------------------------------------------------------------------------------*/
#include "CLucene/StdHeader.h"
#include "Term.h"
#include "CLucene/util/StringIntern.h"
CL_NS_USE(util)
CL_NS_DEF(index)
Term::Term()
{
init();
}
Term::Term(const TCHAR* fld, const TCHAR* txt, bool internField)
{
init();
set(fld, txt, internField);
}
Term::Term(const Term* fieldTerm, const TCHAR* txt)
{
init();
set(fieldTerm, txt);
}
Term::Term(const TCHAR* fld, const TCHAR* txt)
{
init();
set(fld, txt);
}
Term::~Term()
{
if (internF)
CLStringIntern::unintern(_field);
_field = NULL;
#ifndef LUCENE_TERM_TEXT_LENGTH
if (_text != LUCENE_BLANK_STRING)
_CLDELETE_CARRAY(_text);
#endif
}
const TCHAR* Term::field() const
{
return _field;
}
const TCHAR* Term::text() const
{
return _text;
}
void Term::set(const Term* term, const TCHAR* txt)
{
set(term->field(), txt, false);
}
void Term::set(const TCHAR* fld, const TCHAR* txt,bool internField)
{
CND_PRECONDITION(fld != NULL, "fld contains NULL");
CND_PRECONDITION(txt != NULL, "txt contains NULL");
//save field for unintern later
const TCHAR* oldField = _field;
cachedHashCode = 0;
textLen = _tcslen(txt);
//Delete text if it is the owner
#ifdef LUCENE_TERM_TEXT_LENGTH
if (textLen > LUCENE_TERM_TEXT_LENGTH)
textLen = LUCENE_TERM_TEXT_LENGTH;
_tcsncpy(_text,txt,textLen+1);
_text[textLen]=0;
#else
//if the term text buffer is bigger than what we have
if (_text && textLen > textLenBuf) {
if (_text != LUCENE_BLANK_STRING) {
_CLDELETE_ARRAY(_text);
} else {
_text = NULL;
}
textLenBuf = 0;
}
if (_text == LUCENE_BLANK_STRING) {
_text = LUCENE_BLANK_STRING;
} else if (_text == NULL) {
if (txt[0] == 0) {
//if the string is blank and we aren't re-using the buffer...
_text = LUCENE_BLANK_STRING;
} else {
//duplicate the text
_text = stringDuplicate(txt);
textLenBuf = textLen;
}
} else {
//re-use the buffer
_tcscpy(_text,txt);
}
#endif
//Set Term Field
if (internField) {
_field = CLStringIntern::intern(fld CL_FILELINE);
} else {
_field = fld;
}
//unintern old field after interning new one,
if (internF)
CLStringIntern::unintern(oldField);
internF = internField;
CND_PRECONDITION(_tcscmp(fld, _field) == 0, "field not equal");
}
bool Term::equals(const Term* other) const
{
if (cachedHashCode != 0 && other->cachedHashCode != 0
&& other->cachedHashCode != cachedHashCode)
return false;
if (_field == other->_field) {
if (textLen == other->textLen)
return (_tcscmp(_text, other->_text) == 0);
return false;
}
return false;
}
size_t Term::hashCode()
{
if (cachedHashCode == 0)
cachedHashCode = Misc::thashCode(_field) + Misc::thashCode(_text, textLen);
return cachedHashCode;
}
int32_t Term::compareTo(const Term* other) const
{
//Check ret to see if text needs to be compared
if (_field == other->_field)
return _tcscmp(_text, other->_text);
int32_t ret = _tcscmp(_field, other->_field);
if (ret == 0)
ret = _tcscmp(_text, other->_text);
return ret;
}
TCHAR* Term::toString() const
{
return CL_NS(util)::Misc::join(_field, _T(":"), _text);
}
void Term::init()
{
textLen = 0;
internF = false;
cachedHashCode = 0;
_field = LUCENE_BLANK_STRING;
#ifdef LUCENE_TERM_TEXT_LENGTH
_text[0] = 0;
#else
_text = LUCENE_BLANK_STRING;
textLenBuf = 0;
#endif
}
CL_NS_END