[Metafacture] Regex, conjunction

Christoph Böhme christoph at b3e.net
Sun Nov 24 11:11:33 CET 2013


Hi Pascal

A not-operation can be implemented with the following bit of code inside
a combine-element:

<choose name="" value="">
	<data source="051.">
		<!-- This is condition B: -->
		<regexp match="(^[^a|])" />
		<constant value="B_MATCHES" />
	</data>
	<data source="_id">
		<!-- This can be any field that is available in all
		     records: -->
		<constant value="B_DOES_NOT_MATCH" />
	</data>
	<postprocess>
		<!-- This bit implements the not-operation. The
		     choose-element only fires if it has NOT selected
		     B_MATCHES: -->
		<equals string="B_DOES_NOT_MATCH" />
	</postprocess>
</choose>

It is not straight forward but I think it should allow you to write your
"A andnot B" condition.

Writing Metamorph scripts which include conditions seems to be one of
the most unintuitive parts of Metamorph at the moment. I think we should
consider implementing a more expressive approach to do this. Using
<combine> for this is not really straight-forward. I created an issue
for this [1]. The issue outlines two possible ways of implementing it.

Best,
Christoph

[1] https://github.com/culturegraph/metafacture-core/issues/151


Am 15.11.2013 11:25, schrieb Christoph, Pascal:
> Hi *,
> 
> I don't know how to do this with metamorph:
> 
> "If A andnot B => pass to receiver"
> 
> Details:
> Having two entities: entity A has to match a regex, and B has also a regex. The
> whole should be true if A matches and B does NOT match[1]. Furthermore, if B
> does not exist at all, the whole should also be true.
> 
> Thus far I only managed using function "combine" with parameter
> flushWith="record", like this:
> 
> <combine name="foo" value="bar" flushWith="record">
> 	<data source="051.">
> 		<regexp match="(^[^a|])"/>
> 	</data>
> 	<data source="050.">
> 		<regexp match="^a.*"/>
> 	</data>
> </combine>
> 
> I got my "foo bar" if:
> 
> - 050. matches AND 051. is missing
> 
> and that's it, because in Regexp.java nothing is fired (aka "passed to
> receiver") if the regex does not match. And no, I can't formulate the negative
> regex as a positive regex.
> 
> Is there a possibility to do what I want?
> I enhanced the Regexp class with :
> 
> if (this.getNamedValueReceiver().getClass().equals(Combine.class) && !match) {
> getNamedValueReceiver().receive(name, NO_MATCH, source, recordCount, entityCount);
> }
> 
> and adopted the Combine class. It's working , but it does not seem apropriate.
> Anything I missed ?
> 
> cheers, pascal
> _______________________________________________
> Metafacture mailing list
> Metafacture at lists.dnb.de
> http://lists.dnb.de/mailman/listinfo/metafacture
> 



More information about the Metafacture mailing list