separate the internal keyword names and the deck names more clearly

so far, these two concepts were partially mingled in Opm::Parser...
This commit is contained in:
Andreas Lauser 2014-06-27 16:42:54 +02:00
parent 09c5a24473
commit fe638c2fc8
8 changed files with 112 additions and 95 deletions

View File

@ -81,7 +81,7 @@ static void printItems(Opm::ParserKeywordConstPtr keyword)
static void printKeywords (Opm::ParserPtr parser, std::vector<std::string>& keywords)
{
for (auto iterator = keywords.begin(); iterator != keywords.end(); ++iterator) {
Opm::ParserKeywordConstPtr keyword = parser->getKeyword(*iterator);
Opm::ParserKeywordConstPtr keyword = parser->getParserKeyword(*iterator);
printKeyword(keyword);
printItems(keyword);
}
@ -101,7 +101,7 @@ static std::vector<std::string> createListOfKeywordsToDescribe(char** argv, bool
{
std::vector<std::string> keywords;
if (allKeywords) {
keywords = parser->getAllKeywords();
keywords = parser->getAllParserKeywordNames();
} else {
keywords.push_back(argv[1]);
}

View File

@ -41,8 +41,8 @@ static ParserPtr createWWCTParser() {
ParserKeywordPtr summaryKeyword = ParserKeyword::createFixedSized("SUMMARY" , (size_t) 0);
ParserPtr parser(new Parser());
parser->addKeyword(parserKeyword);
parser->addKeyword(summaryKeyword);
parser->addParserKeyword(parserKeyword);
parser->addParserKeyword(summaryKeyword);
return parser;
}
@ -110,8 +110,8 @@ static ParserPtr createBPRParser() {
}
ParserKeywordPtr summaryKeyword = ParserKeyword::createFixedSized("SUMMARY" , (size_t) 0);
ParserPtr parser(new Parser());
parser->addKeyword(parserKeyword);
parser->addKeyword(summaryKeyword);
parser->addParserKeyword(parserKeyword);
parser->addParserKeyword(summaryKeyword);
return parser;
}
@ -221,7 +221,7 @@ BOOST_AUTO_TEST_CASE(parse_truncatedrecords_deckFilledWithDefaults) {
BOOST_CHECK_EQUAL(ParserItem::defaultInt(), radfin4_2_nodata->getRecord(0)->getItem(1)->getInt(0));
ParserKeywordConstPtr parserKeyword = parser->getKeyword("RADFIN4");
ParserKeywordConstPtr parserKeyword = parser->getParserKeyword("RADFIN4");
ParserRecordConstPtr parserRecord = parserKeyword->getRecord();
ParserItemConstPtr nwmaxItem = parserRecord->get("NWMAX");
ParserIntItemConstPtr intItem = std::static_pointer_cast<const ParserIntItem>(nwmaxItem);

View File

@ -43,8 +43,8 @@ BOOST_AUTO_TEST_CASE( parse_ACTION_OK ) {
ParserKeywordConstPtr THROW = ParserKeyword::createFixedSized("THROW" , UNKNOWN , THROW_EXCEPTION );
BOOST_REQUIRE( parser->loadKeywordFromFile( boost::filesystem::path( std::string(KEYWORD_DIRECTORY) + std::string("/W/WCONHIST") )) );
parser->addKeyword( DIMENS );
parser->addKeyword( THROW );
parser->addParserKeyword( DIMENS );
parser->addParserKeyword( THROW );
BOOST_REQUIRE( parser->canParseKeyword( "DIMENS" ));
BOOST_REQUIRE( parser->canParseKeyword( "WCONHIST" ));

View File

@ -115,22 +115,8 @@ namespace Opm {
}
size_t Parser::size() const {
return m_parserKeywords.size();
return m_deckParserKeywords.size();
}
void Parser::addKeyword(ParserKeywordConstPtr parserKeyword) {
for (auto nameIt = parserKeyword->deckNamesBegin();
nameIt != parserKeyword->deckNamesEnd();
++nameIt)
{
m_parserKeywords[*nameIt] = parserKeyword;
}
if (parserKeyword->hasMatchRegex())
m_wildCardKeywords[parserKeyword->getName()] = parserKeyword;
}
ParserKeywordConstPtr Parser::matchingKeyword(const std::string& name) const {
for (auto iter = m_wildCardKeywords.begin(); iter != m_wildCardKeywords.end(); ++iter) {
@ -141,55 +127,78 @@ namespace Opm {
}
bool Parser::hasKeyword(const std::string& keyword) const {
return (m_parserKeywords.find(keyword) != m_parserKeywords.end());
bool Parser::hasKeyword(const std::string& internalKeywordName) const {
return (m_internalParserKeywords.count(internalKeywordName) > 0);
}
bool Parser::hasWildCardKeyword(const std::string& keyword) const {
return (m_wildCardKeywords.find(keyword) != m_parserKeywords.end());
bool Parser::hasWildCardKeyword(const std::string& internalKeywordName) const {
return (m_wildCardKeywords.count(internalKeywordName) > 0);
}
bool Parser::canParseKeyword( const std::string& keyword) const {
if (hasKeyword(keyword))
bool Parser::canParseKeyword( const std::string& deckKeywordName) const {
if (!ParserKeyword::validDeckName(deckKeywordName))
return false;
if (m_deckParserKeywords.count(deckKeywordName) > 0)
return true;
else {
ParserKeywordConstPtr wildCardKeyword = matchingKeyword( keyword );
if (wildCardKeyword)
return true;
else
return false;
}
ParserKeywordConstPtr wildCardKeyword = matchingKeyword( deckKeywordName );
return wildCardKeyword?true:false;
}
void Parser::addParserKeyword(ParserKeywordConstPtr parserKeyword) {
m_internalParserKeywords[parserKeyword->getName()] = parserKeyword;
for (auto nameIt = parserKeyword->deckNamesBegin();
nameIt != parserKeyword->deckNamesEnd();
++nameIt)
{
m_deckParserKeywords[*nameIt] = parserKeyword;
}
if (parserKeyword->hasMatchRegex())
m_wildCardKeywords[parserKeyword->getName()] = parserKeyword;
}
bool Parser::dropParserKeyword(const std::string& parserKeywordName) {
// remove from the internal from the internal names
bool erase = (m_internalParserKeywords.erase( parserKeywordName ) > 0);
// remove keyword from the deck names map
auto deckParserKeywordIt = m_deckParserKeywords.begin();
while (deckParserKeywordIt != m_deckParserKeywords.end()) {
if (deckParserKeywordIt->second->getName() == parserKeywordName)
// note the post-increment of the iterator. this is required to keep the
// iterator valid for while at the same time erasing it...
m_deckParserKeywords.erase(deckParserKeywordIt++);
else
++ deckParserKeywordIt;
}
// remove the keyword from the wildcard list
m_wildCardKeywords.erase( parserKeywordName );
bool Parser::dropKeyword(const std::string& keyword) {
bool erase = (m_parserKeywords.erase( keyword ) == 1);
m_wildCardKeywords.erase( keyword );
return erase;
}
ParserKeywordConstPtr Parser::getKeyword(const std::string& keyword) const {
if (hasKeyword(keyword)) {
return m_parserKeywords.at(keyword);
ParserKeywordConstPtr Parser::getParserKeyword(const std::string& deckKeywordName) const {
if (hasKeyword(deckKeywordName)) {
return m_deckParserKeywords.at(deckKeywordName);
} else {
ParserKeywordConstPtr wildCardKeyword = matchingKeyword( keyword );
ParserKeywordConstPtr wildCardKeyword = matchingKeyword( deckKeywordName );
if (wildCardKeyword)
return wildCardKeyword;
else
throw std::invalid_argument("Do not have parser keyword for parsing: " + keyword);
throw std::invalid_argument("Do not have parser keyword for parsing: " + deckKeywordName);
}
}
std::vector<std::string> Parser::getAllKeywords () const {
std::vector<std::string> Parser::getAllParserKeywordNames () const {
std::vector<std::string> keywords;
for (auto iterator = m_parserKeywords.begin(); iterator != m_parserKeywords.end(); iterator++) {
for (auto iterator = m_deckParserKeywords.begin(); iterator != m_deckParserKeywords.end(); iterator++) {
keywords.push_back(iterator->first);
}
for (auto iterator = m_wildCardKeywords.begin(); iterator != m_wildCardKeywords.end(); iterator++) {
@ -261,7 +270,7 @@ namespace Opm {
std::cout << parserState->rawKeyword->getKeywordName() << std::endl;
if (canParseKeyword(parserState->rawKeyword->getKeywordName())) {
ParserKeywordConstPtr parserKeyword = getKeyword(parserState->rawKeyword->getKeywordName());
ParserKeywordConstPtr parserKeyword = getParserKeyword(parserState->rawKeyword->getKeywordName());
ParserKeywordActionEnum action = parserKeyword->getAction();
if (action == INTERNALIZE) {
DeckKeywordPtr deckKeyword = parserKeyword->parse(parserState->rawKeyword);
@ -291,7 +300,7 @@ namespace Opm {
Json::JsonObject jsonKeyword = jsonKeywords.get_array_item(index);
ParserKeywordConstPtr parserKeyword = ParserKeyword::createFromJson(jsonKeyword);
addKeyword(parserKeyword);
addParserKeyword(parserKeyword);
}
} else
throw std::invalid_argument("Input JSON object is not an array");
@ -299,7 +308,7 @@ namespace Opm {
RawKeywordPtr Parser::createRawKeyword(const std::string & keywordString, std::shared_ptr<ParserState> parserState) const {
if (canParseKeyword(keywordString)) {
ParserKeywordConstPtr parserKeyword = getKeyword( keywordString );
ParserKeywordConstPtr parserKeyword = getParserKeyword( keywordString );
ParserKeywordActionEnum action = parserKeyword->getAction();
if (action == THROW_EXCEPTION)
@ -390,7 +399,7 @@ namespace Opm {
try {
Json::JsonObject jsonKeyword(configFile);
ParserKeywordConstPtr parserKeyword = ParserKeyword::createFromJson(jsonKeyword);
addKeyword(parserKeyword);
addParserKeyword(parserKeyword);
return true;
}
catch (...) {
@ -432,7 +441,7 @@ namespace Opm {
for (size_t index=0; index < deck->size(); ++index) {
DeckKeywordPtr deckKeyword = deck->getKeyword( index );
if (canParseKeyword( deckKeyword->name())) {
ParserKeywordConstPtr parserKeyword = getKeyword( deckKeyword->name() );
ParserKeywordConstPtr parserKeyword = getParserKeyword( deckKeyword->name() );
if (parserKeyword->hasDimension()) {
parserKeyword->applyUnitsToDeck(deck , deckKeyword);
}

View File

@ -51,20 +51,32 @@ namespace Opm {
DeckPtr parseStream(std::shared_ptr<std::istream> inputStream, bool strictParsing=true) const;
/// Method to add ParserKeyword instances, these holding type and size information about the keywords and their data.
void addKeyword(ParserKeywordConstPtr parserKeyword);
bool dropKeyword(const std::string& keyword);
bool canParseKeyword( const std::string& keyword) const;
ParserKeywordConstPtr getKeyword(const std::string& keyword) const;
std::vector<std::string> getAllKeywords () const;
void addParserKeyword(ParserKeywordConstPtr parserKeyword);
bool dropParserKeyword(const std::string& parserKeywordName);
bool canParseKeyword( const std::string& deckKeywordName) const;
ParserKeywordConstPtr getParserKeyword(const std::string& deckKeywordName) const;
std::vector<std::string> getAllParserKeywordNames () const;
void loadKeywords(const Json::JsonObject& jsonKeywords);
bool loadKeywordFromFile(const boost::filesystem::path& configFile);
void loadKeywordsFromDirectory(const boost::filesystem::path& directory , bool recursive = true);
size_t size() const;
void applyUnitsToDeck(DeckPtr deck) const;
/*!
* \brief Returns the approximate number of recognized keywords in decks
*
* This is an approximate number because regular expresions are disconsidered.
*/
size_t size() const;
private:
std::map<std::string, ParserKeywordConstPtr> m_parserKeywords;
// associative map of the parser internal name and the corresponding ParserKeyword object
std::map<std::string, ParserKeywordConstPtr> m_internalParserKeywords;
// associative map of deck names and the corresponding ParserKeyword object
std::map<std::string, ParserKeywordConstPtr> m_deckParserKeywords;
// associative map of the parser internal names and the corresponding
// ParserKeyword object for keywords which match a regular expression
std::map<std::string, ParserKeywordConstPtr> m_wildCardKeywords;
bool hasKeyword(const std::string& keyword) const;

View File

@ -530,12 +530,8 @@ namespace Opm {
bool ParserKeyword::equal(const ParserKeyword& other) const {
// compare the deck names. we don't care about the ordering of the strings.
for (auto deckNameIt = m_deckNames.begin(); deckNameIt != m_deckNames.end(); ++deckNameIt)
if (!other.m_deckNames.count(*deckNameIt))
return false;
for (auto deckNameIt = other.m_deckNames.begin(); deckNameIt != other.m_deckNames.end(); ++deckNameIt)
if (!m_deckNames.count(*deckNameIt))
return false;
if (m_deckNames != other.m_deckNames)
return false;
if ((m_name == other.m_name) &&
(m_matchRegexString == other.m_matchRegexString) &&

View File

@ -163,7 +163,7 @@ static void generateSourceForKeyword(std::iostream& of, KeywordElementType keywo
of << "{" << std::endl;
of << indent << "ParserKeywordPtr ";
parserKeyword->inlineNew(of , keywordName , indent);
of << indent << "addKeyword( " << keywordName << ");" << std::endl;
of << indent << "addParserKeyword( " << keywordName << ");" << std::endl;
of << "}" << std::endl << std::endl;
std::cout << "Creating keyword: " << keywordName << std::endl;

View File

@ -47,14 +47,14 @@ BOOST_AUTO_TEST_CASE(addKeyword_keyword_doesntfail) {
Parser parser;
{
ParserKeywordPtr equilKeyword = ParserKeyword::createDynamicSized("EQUIL");
parser.addKeyword(equilKeyword);
parser.addParserKeyword(equilKeyword);
}
}
BOOST_AUTO_TEST_CASE(canParseKeyword_canParseKeyword_returnstrue) {
ParserPtr parser(new Parser());
parser->addKeyword(ParserKeyword::createDynamicSized("FJAS"));
parser->addParserKeyword(ParserKeyword::createDynamicSized("FJAS"));
BOOST_CHECK(parser->canParseKeyword("FJAS"));
}
@ -62,30 +62,30 @@ BOOST_AUTO_TEST_CASE(canParseKeyword_canParseKeyword_returnstrue) {
BOOST_AUTO_TEST_CASE(getKeyword_haskeyword_returnskeyword) {
ParserPtr parser(new Parser());
ParserKeywordConstPtr parserKeyword = ParserKeyword::createDynamicSized("FJAS");
parser->addKeyword(parserKeyword);
BOOST_CHECK_EQUAL(parserKeyword, parser->getKeyword("FJAS"));
parser->addParserKeyword(parserKeyword);
BOOST_CHECK_EQUAL(parserKeyword, parser->getParserKeyword("FJAS"));
}
BOOST_AUTO_TEST_CASE(getKeyword_hasnotkeyword_getKeywordThrowsException) {
ParserPtr parser(new Parser());
ParserKeywordConstPtr parserKeyword = ParserKeyword::createDynamicSized("FJAS");
parser->addKeyword(parserKeyword);
BOOST_CHECK_THROW(parser->getKeyword("FJASS"), std::invalid_argument);
parser->addParserKeyword(parserKeyword);
BOOST_CHECK_THROW(parser->getParserKeyword("FJASS"), std::invalid_argument);
}
BOOST_AUTO_TEST_CASE(getAllKeywords_hasTwoKeywords_returnsCompleteList) {
BOOST_AUTO_TEST_CASE(getAllParserKeywordNames_hasTwoKeywords_returnsCompleteList) {
ParserPtr parser(new Parser(false));
std::cout << parser->getAllKeywords().size() << std::endl;
std::cout << parser->getAllParserKeywordNames().size() << std::endl;
ParserKeywordConstPtr firstParserKeyword = ParserKeyword::createDynamicSized("FJAS");
parser->addKeyword(firstParserKeyword);
parser->addParserKeyword(firstParserKeyword);
ParserKeywordConstPtr secondParserKeyword = ParserKeyword::createDynamicSized("SAJF");
parser->addKeyword(secondParserKeyword);
BOOST_CHECK_EQUAL(2U, parser->getAllKeywords().size());
parser->addParserKeyword(secondParserKeyword);
BOOST_CHECK_EQUAL(2U, parser->getAllParserKeywordNames().size());
}
BOOST_AUTO_TEST_CASE(getAllKeywords_hasNoKeywords_returnsEmptyList) {
BOOST_AUTO_TEST_CASE(getAllParserKeywordNames_hasNoKeywords_returnsEmptyList) {
ParserPtr parser(new Parser(false));
BOOST_CHECK_EQUAL(0U, parser->getAllKeywords().size());
BOOST_CHECK_EQUAL(0U, parser->getAllParserKeywordNames().size());
}
@ -93,18 +93,18 @@ BOOST_AUTO_TEST_CASE(getAllKeywords_hasNoKeywords_returnsEmptyList) {
/************************ JSON config related tests **********************'*/
BOOST_AUTO_TEST_CASE(addKeywordJSON_canParseKeyword_returnstrue) {
BOOST_AUTO_TEST_CASE(addParserKeywordJSON_canParseKeyword_returnstrue) {
ParserPtr parser(new Parser());
Json::JsonObject jsonConfig("{\"name\": \"BPR\", \"size\" : 100 , \"items\" :[{\"name\":\"ItemX\" , \"size_type\":\"SINGLE\" , \"value_type\" : \"DOUBLE\"}]}");
parser->addKeyword(ParserKeyword::createFromJson( jsonConfig ));
parser->addParserKeyword(ParserKeyword::createFromJson( jsonConfig ));
BOOST_CHECK(parser->canParseKeyword("BPR"));
}
BOOST_AUTO_TEST_CASE(addKeywordJSON_size_isObject_allGood) {
BOOST_AUTO_TEST_CASE(addParserKeywordJSON_size_isObject_allGood) {
ParserPtr parser(new Parser());
Json::JsonObject jsonConfig("{\"name\": \"EQUIXL\", \"size\" : {\"keyword\":\"EQLDIMS\" , \"item\" : \"NTEQUL\"}, \"items\" :[{\"name\":\"ItemX\" , \"size_type\":\"SINGLE\" , \"value_type\" : \"DOUBLE\"}]}");
parser->addKeyword(ParserKeyword::createFromJson( jsonConfig ));
parser->addParserKeyword(ParserKeyword::createFromJson( jsonConfig ));
BOOST_CHECK(parser->canParseKeyword("EQUIXL"));
}
@ -238,27 +238,27 @@ BOOST_AUTO_TEST_CASE(loadConfigFromDirectory_default) {
BOOST_AUTO_TEST_CASE(DropKeyword) {
ParserPtr parser(new Parser());
BOOST_CHECK_EQUAL(false , parser->dropKeyword("DoesNotHaveThis"));
BOOST_CHECK_EQUAL(false , parser->dropParserKeyword("DoesNotHaveThis"));
BOOST_CHECK_EQUAL(true , parser->canParseKeyword("BPR"));
BOOST_CHECK_EQUAL(true , parser->dropKeyword("BLOCK_PROBE"));
BOOST_CHECK_EQUAL(false , parser->dropKeyword("BLOCK_PROBE"));
BOOST_CHECK_EQUAL(true , parser->dropParserKeyword("BLOCK_PROBE"));
BOOST_CHECK_EQUAL(false , parser->dropParserKeyword("BLOCK_PROBE"));
BOOST_CHECK_EQUAL(false , parser->canParseKeyword("BPR"));
BOOST_CHECK_EQUAL(true , parser->canParseKeyword("TVDPX"));
BOOST_CHECK_EQUAL(true , parser->dropKeyword("TVDP*"));
BOOST_CHECK_EQUAL(true , parser->dropParserKeyword("TVDP"));
BOOST_CHECK_EQUAL(false , parser->canParseKeyword("TVDPX"));
}
BOOST_AUTO_TEST_CASE(ReplaceKeyword) {
ParserPtr parser(new Parser());
ParserKeywordConstPtr eqldims = parser->getKeyword("EQLDIMS");
ParserKeywordConstPtr eqldims = parser->getParserKeyword("EQLDIMS");
BOOST_CHECK_EQUAL( 5U , eqldims->numItems());
BOOST_CHECK( parser->loadKeywordFromFile( "testdata/parser/EQLDIMS2" ) );
eqldims = parser->getKeyword("EQLDIMS");
eqldims = parser->getParserKeyword("EQLDIMS");
BOOST_CHECK_EQUAL( 1U , eqldims->numItems());
}
@ -273,9 +273,9 @@ BOOST_AUTO_TEST_CASE(WildCardTest) {
BOOST_CHECK(!parser->canParseKeyword("TVDP"));
ParserKeywordConstPtr keyword1 = parser->getKeyword("TVDPA");
ParserKeywordConstPtr keyword2 = parser->getKeyword("TVDPBC");
ParserKeywordConstPtr keyword3 = parser->getKeyword("TVDPXXX");
ParserKeywordConstPtr keyword1 = parser->getParserKeyword("TVDPA");
ParserKeywordConstPtr keyword2 = parser->getParserKeyword("TVDPBC");
ParserKeywordConstPtr keyword3 = parser->getParserKeyword("TVDPXXX");
BOOST_CHECK_EQUAL( keyword1 , keyword2 );
BOOST_CHECK_EQUAL( keyword1 , keyword3 );