Comparison of NSPredicate and Spotlight Query Strings
OSXDEV
Predicates Programming Guide로 이동
스팟라이트와 NSPredicate 둘다 모두 쿼리 스트링 문법을 사용하는 등 유사하지만, 몇몇 부분에서 다르다.일반적인 함수의 서브셋이 사용된다면 한쪽 쿼리 스트링이 다른 쪽 스트링 형식으로 변환가능하다.
[편집] Spotlight and NSPredicate
NSMetadataQuery가 스폿라이트의 코코아 인터페이스 인 것과 그 API에서 NSPredicate를 사용한다는 것을 제외하면 spotlight와 NSPredicate사이의 특별한 관계는 없다. 스폿라이트 쿼리 스트링 문법은 NSPredicate쿼리 문법과 유사하긴 하지만 다르다. 일반적인 함수의 서브셋을 사용한다면 서로 변환할 수 있다.- 스폿라이트의 쿼리 문법은 일반적으로 NSPredicate의 문법보다 더 제한적이다. 스폿라이트 쿼리 표현 문법에 대한 완전한 해설은 Query Expression Syntax를 보고, NSPredicate 스트링 문법에 대한 완전한 설명은 “Predicate Format String Syntax”를 보라.
스폿라이트는 "KEY operator VALUE" 형식을 취하기 위해 비교comparison 구문을 사용해야 하며, "VALUE operator KEY"구문은 받아들이지 않는다. 게다가 스폿라이트가 VALUE로 받아들이는 어트리뷰트의 종류는 NSPredicate보다 제한적이다. 이러한 제한이 부분적으로 영행을 미치기 때문에, 스폿라이트 쿼리에서 항상 quote구문을 사용할 필요는 없다. VALUE가 스트링이고 특별한 연산자를 필요로 하지 않으면 따옴표를 생략할 수 있다. 결과값이 모호해 지기 때문에 NSPredicate쿼리 스트링에서는 이렇게 할 수 없다.
스팟라이트 쿼리의 대소문자와 diacritic를 무시하는 문법표기가 NSPredicate와 다르다. 스팟라이트에서는 마커를 비교 스트링의 끝에 더한다 (예를 들어, "myAttribute == 'foo'cd"). NSPredicate 스트링에서는 like연산자와 마커를 "[]"안에 붙인다.(예를 들어, "myAttribute like[cd] 'foo'"). 두 경우 모두 'cd'는 대소문자와 diacritic를 구별하지 않는다는 것을 의미한다. 스팟라이트는 수정자를 값에 넣고, NSPredicate는 수정자를 오퍼레이터에 넣는다.
MDQuery 오퍼레이터를 NSPredicate의 "KEY operator VALUE"에서의 VALUE로 사용할 수 없다.예를 들어, 스팟라이트에서는 다음과 같이 "is-substring-of" 표현을 사용할 수 있다: "myAttribute = '*foo*'"; NSPredicate 스트링에서는 다음과 같이 contains오퍼레이터를 사용한다:"myAttribute contains 'foo'". 스팟라이트는 glob-like 표현을 취하고, NSPredicate는 different 연산자를 사용한다.
비교 표현에서 왼쪽편의 키로 "*"를 사용한다면, 스팟라이트에서는 "아이템내의 모든 키"를 의미하며 ==와 함께만 사용할 수 있다. 해당 공식을 NSPredicate에서는 NSMetadataQuery와 함께 사용가능하다.
[편집] Creating a Predicate Format String From a Spotlight Search in Finder
파인더에서의 검색에 프리디케이트 포맷 스트링을 생성할 수 있다. 검색을 수행한 후, 저장하고, 저장한 폴더를 열어 Show Info를 하라 - 인포 패널에 스팟라이트에 이용된 쿼리문이 보일 것이다. 그러나, NSPredicate포맷 스트링과 파인더에 저장된 것과 파인더에 저장된 것에는 약간 차이가 있다. 파인더 스트링은 다음과 같이 보일 것이다.
(((* = "FooBar*"wcd)) || (kMDItemTextContent = "FooBar*"cd)) && (kMDItemContentType != com.apple.mail.emlx) && (kMDItemContentType != public.vcard))
전형적으로 스폿라이트 쿼리를 프리디케이트 포맷으로 변환하는 데 필요한 일은, 프리디케이트는 *로 시작하지 않는다는 것을 확인 하는 것이다. (프리디케이트를 파싱할 때 NSMetadataQuery에서 지원되지 않는다). 게다가, 와일드카드를 사용할 때, 다음 예제처럼 LIKE를 사용해야 한다.
(((kMDItemTextContent LIKE[cd] "FooBar") && (kMDItemContentType != "com.apple.mail.emlx") && (kMDItemContentType != "public.vcard"))




