Custom TOM MARC Expression Language Examples

Starting with Polaris 8.1, customers can now add Custom TOMs to Polaris, using a new MARC Expression Language (MEL). We’ve been testing the new TOMs, so I wanted to share what we’ve implemented so far in the hopes that this gives others a helpful starting point.

These examples are based on our cataloging practices and might need to be adjusted depending on your local systems.

Please update the post or reply with your own examples, improvements, or other approaches.


Playaway

Based on OLAC Best Practices

LDR/06 = i (Nonmusical sound recording)
006/00 = m (Computer file)
006/06 = q (Direct electronic)
006/09 = h (Sound)

AND DOES NOT CONTAIN:
006/00 = a (Language Material)

MEL:
(LDR/06 = 'i' and (ANY 006 WHERE (_ matches /^m.{5}q.{2}h/i)) and not (006/00 = 'a'))

SQL (to check bibs that match)

SELECT DISTINCT BR.BibliographicRecordID
FROM Polaris.BibliographicRecords BR
WHERE BR.RecordStatusID = 1
	AND BR.MARCBibType = 'i'
AND EXISTS (
	SELECT 1
	FROM Polaris.BibliographicTags BT006
	JOIN Polaris.BibliographicSubfields BS006
		ON BT006.BibliographicTagID = BS006.BibliographicTagID
	WHERE BT006.BibliographicRecordID = BR.BibliographicRecordID
		AND BT006.TagNumber = 6
		AND LEFT(BS006.Data,10) LIKE 'm_____q__h'
)
AND NOT EXISTS (
	SELECT 1
	FROM Polaris.BibliographicTags BT006
	JOIN Polaris.BibliographicSubfields BS006
		ON BT006.BibliographicTagID = BS006.BibliographicTagID
	WHERE BT006.BibliographicRecordID = BR.BibliographicRecordID
		AND BT006.TagNumber = 6
		AND LEFT(BS006.Data,1) = 'a'

)

Read Along Book

Examples: VoxBook / WonderBook.
Based on OLAC Best Practices)

(Two 006s Needed)
LDR/06 = i (Nonmusical sound recording)
006/00 = m (Computer file)
006/06 = q (Direct electronic)
006/09 = h (Sound)

006/00 = a (Language Material)

MEL:
(LDR/06 = 'i' and (ANY 006 WHERE (_ matches /^m.{5}q.{2}h/i)) and (006/00 = 'a'))

SQL (to check bibs that match)

SELECT DISTINCT BR.BibliographicRecordID
FROM Polaris.BibliographicRecords BR
WHERE BR.RecordStatusID = 1
	AND BR.MARCBibType = 'i'
AND EXISTS (
	SELECT 1
	FROM Polaris.BibliographicTags BT006
	JOIN Polaris.BibliographicSubfields BS006
		ON BT006.BibliographicTagID = BS006.BibliographicTagID
	WHERE BT006.BibliographicRecordID = BR.BibliographicRecordID
		AND BT006.TagNumber = 6
		AND LEFT(BS006.Data,10) LIKE 'm_____q__h'
)
AND EXISTS (
	SELECT 1
	FROM Polaris.BibliographicTags BT006
	JOIN Polaris.BibliographicSubfields BS006
		ON BT006.BibliographicTagID = BS006.BibliographicTagID
	WHERE BT006.BibliographicRecordID = BR.BibliographicRecordID
		AND BT006.TagNumber = 6
		AND LEFT(BS006.Data,1) = 'a'

)

Board Book

340$l board book binding

MEL:
340$l matches /board( |-)book|boardbook binding/i

SQL (to check bibs that match):

SELECT DISTINCT BR.BibliographicRecordID
FROM Polaris.BibliographicRecords BR
JOIN Polaris.BibliographicTags BT340
  ON BR.BibliographicRecordID = BT340.BibliographicRecordID
 AND BT340.TagNumber = 340
JOIN Polaris.BibliographicSubfields BS340
  ON BT340.BibliographicTagID = BS340.BibliographicTagID
  AND BS340.Subfield = 'l'
WHERE BR.RecordStatusID = 1
  AND BS340.Data LIKE 'Board%Book%Binding'

Playaway Launchpad

LDR/06 - m (computer file)
007/00 - c (electronic resource)
007/01 - s (standalone device)
007/03 - c (multicolored)

MEL:
LDR/06 = 'm' and 007/00 = 'c' and 007/01 = 's' and 007/03 = 'c'

SQL (to check bibs that match)

SELECT DISTINCT BR.BibliographicRecordID
FROM Polaris.BibliographicRecords BR
WHERE BR.RecordStatusID = 1
AND BR.MARCBibType = 'm'
AND EXISTS (
	SELECT 1
	FROM Polaris.BibliographicTags BT007a
	JOIN Polaris.BibliographicSubfields BS007a
		ON BT007a.BibliographicTagID = BS007a.BibliographicTagID
	WHERE BT007a.BibliographicRecordID = BR.BibliographicRecordID
		AND BT007a.TagNumber = 7
		AND SUBSTRING(BS007a.Data,1,1) = 'c'
		AND SUBSTRING(BS007a.Data,2,1) = 's'
		AND SUBSTRING(BS007a.Data,4,1) = 'c'
)

WhaZoodle

Pre-loaded media player, like a playaway for kids.

LDR/06 - m (Computer file)
007/00 - c (Electronic resource)
007/01 - z (Other)
007/00 - s (Sound recording)
007/01 - z (Other)
008/23 - q (Direct electronic)
008/26 - h (Sound)

MEL:
LDR/06 = 'm' and ANY 007 WHERE (_ matches /^cz/i) and ANY 007 WHERE (_ matches /^sz/i) and 008/23 = 'q' and 008/26 = 'h'

SQL (to check bibs that match)


SELECT DISTINCT BR.BibliographicRecordID
FROM Polaris.BibliographicRecords BR
JOIN Polaris.BibliographicTags BT008
  ON BR.BibliographicRecordID = BT008.BibliographicRecordID
 AND BT008.TagNumber = 008
JOIN Polaris.BibliographicSubfields BS008
  ON BT008.BibliographicTagID = BS008.BibliographicTagID
WHERE BR.RecordStatusID = 1
	AND BR.MARCBibType = 'm'
AND EXISTS (
	SELECT 1
	FROM Polaris.BibliographicTags BT007a
	JOIN Polaris.BibliographicSubfields BS007a
		ON BT007a.BibliographicTagID = BS007a.BibliographicTagID
	WHERE BT007a.BibliographicRecordID = BR.BibliographicRecordID
		AND BT007a.TagNumber = 007
		AND LEFT(BS007a.Data,2) = 'cz'
)
AND EXISTS (
	SELECT 1
	FROM Polaris.BibliographicTags BT007b
	JOIN Polaris.BibliographicSubfields BS007b
		ON BT007b.BibliographicTagID = BS007b.BibliographicTagID
	WHERE BT007b.BibliographicRecordID = BR.BibliographicRecordID
		AND BT007b.TagNumber = 007
		AND LEFT(BS007b.Data,2) = 'sz'
)
  AND SUBSTRING(BS008.Data,24,1) = 'q'
  AND SUBSTRING(BS008.Data,27,1) = 'h'


Book (modified)

Added “not 006/00 = m” to existing Book TOM to remove electronic items.

((LDR/06 in ['a','t'] and not (LDR/07 in ['b','i','s'])) or (006/00 in ['a','t']) or (007/00 = 't')) and not (006/00 in ['m'])

2 Likes

This is great Matt. Thank you for sharing. We upgrade tomorrow so it will be nice to have a starting point for some of the ones we know we want to add.