View this PageEdit this PageAttachments to this PageHistory of this PageHomeRecent ChangesSearch the SwikiHelp Guide
Hotspots: Admin Pages | Turn-in Site |
Current Links: Cases Final Project Summer 2007

Questions on Fall2002 P2 Milestone

Questions, concerns, comments? Put 'em here!
Please include your name

Are we still working under the assumption that there will never be more than 7 relatives per generation or should we expand this to account for more? - Michael D. Johnson

You can stick with the limit of 7 for purposes on M2 testing, but you do not need to enforce that restriction. It is a limitation on the test set we will use. Future versions of your system should be more general. Rich LeBlanc

For the purposes of queries, what is the definition of "a relative of P"?
In other words, is a half-brother of P a relative? Aunts? Nieces? Step parents? Step children? Great step parents? Cousins? etc.
Or are relatives only direct ancenstors and decendents of p?
Thanks. T. Scott Saponas (Monkeys with Vertigo)

"Relatives" in this context will be direct descendants, siblings, direct ancestors and siblings of direct ancestores (thus including Aunts and Uncles, Great Aunts and Uncles, etc.). Rich LeBlanc

Should marriages be traversed, as well? Lex Spoon

I deliberately left out marriages, since they open the door to a whole bunch of messy questions. Let's just stick with the definition above. Rich LeBlanc

Statement 1) If Mary(x) is Bob's (y) sibling, then Mary's parents are Bob's (y) parents.

Statement 2) (if one of x or y's parents is missing – it is possible for x and y to have different parents but be siblings).

These two statements seem to be contradictory. Can someone help clarify things for me? In the second case, do we or do we not set unknown parents.

For example:
o Bob and Mary are siblings
o Bob knows his parents are Jack and Jill
o Mary knows her mom is Jill

Statement one would lead me to believe that I should set Mary's parents to Bob's parents, but Statement 2 leads me to beliebe that they can have different parents, but still be siblings. So what _exactly_ is meant by the status 'sibling'?

I've e-mailed the other TAs to try and figure out a good definition of "relative" for M2 and to answer your questions about autocorrecting siblings/parents/etc. I'll post the results once we receive them. Chris Verges

We have decided to work only with full siblings for this kind of test case, so Mary and Bob should indeed have the same parents. Rich LeBlanc

When printing the missing vital information, does the missing information need to be listed by person with its missing info or by type of missing info with a list of people missing that information?
Thanks. Trayton Otto (Monkeys with Vertigo)

You can do it either way, but I think it should be a lot easier to generate it by person. Rich LeBlanc

If #hasSibling is called on a person, may we assume that either the mother or father are known? –Jimi Malcolm (malcolm@cc)

No, since it is possible to define siblings without a mother or father. Rich LeBlanc

Do all queries have to be used through the Person searchFor: method? Or does query have to search each and every Person instance available? If we select "(Query surName: 'Flintstone') and tried DoIt, would that return an OrderedCollection, or do we have to DoIt on "p searchFor: (Query surName: 'Flintstone')"? What about if we have Person A and Person B who are completely unrelated?

If query is intented to be used by itself (ie: Query surName: 'Flintstone'.), then do we need to have some way to keep track of every Person instantiated even if we have multiple family trees (based off of multiple, unrelated people)? (Donated by Intel)

Yes, the Milestone indicates that you need to be able to do global searches over all instances of Person. Keeping a collection of all instances is a good use for a class variable. Rich LeBlanc

The original question remains unanswered. Do all queries have to be used through the Person searchFor: method? Should Query surName: 'Flintstone'. actually perform a search? I will assume that it is only meant to work from Person's searchFor method unless I am corrected here.

No, you must use queries via the searchFor: call. Chris Verges

For the check message, the info file says that this message should check for missing vital information, connect mirror and transitive information and identify conflicts and contradictions. Are we allowed to connect the mirror and transitive information and identify conflicts while we are adding the information rather than when the check message is sent?

Yes. Sami Deen Please include your name with questions,

When performing the check method on a person, do the connect mirror and transitive information and the identify conflicts and contradictions functions traverse the person's entire family tree (i.e. all relatives), or just the person's immediate family (i.e. spouses, siblings, children). In other words, should you have to do multiple checks on different family members to validate the tree, or should a check on one person validate the entire tree. Derek Chambless

One check traverses the whole tree. -Lex Spoon

Is there no display associated with this milestone other than the formatted string for information? I noticed it was not in the grading criteria. For this milestone are we simply build the storage structure and running checks and queries all from the workspace with no visual output like milestone 1, or do we keep all the functionality from milestone 1? Derek Chambless

I would hold on to functionality from M1. M4 requires that all functinality from M1, and M2 work. Sami Deen

Will you be testing display functionality from M1 in M2? We had some trouble with the display from M1, so do we need to fix that to get full credit for M2, or should we just implement a working display by M4 time? Derek Chambless

No testing of M1 stuff in M2. M1 functionality will be tested again in M4. Sami Deen.

Let me append this the obvious: no explicit testing of M1 stuff. Things like creating Person objects will be implicitly tested.
Sami Deen

Identify contradictions and conflicts - Should the tests be limited to the ones listed in the assignment. Are we accountable for several conflicts one might find - males having children with males, person being listed as a child of more than one couple, etc?

You are not limited to the ones listed in the assignment.
Start with most obvious issues, cover your basic cases then
move on to more unconventional ones if you have the time.
Check with your TA's about how thoroughly they will be testing this feature.
Sami Deen|

You will have to answer that question in more detail. The
implementation of cases depends on rules that vary on factors like
culture, era, biology,etc which you havent specified. For example
how old is the youngest possible father? youngest mother? whats the
legal age to get married? Is polygamy legal?

These are good questions. We are looking for biological integrity in the relationships. That would make polygamy legal. As for youngest possible age for a father, or mother, I thing a reasonable cut off age would be anywhere between 10 and 15. I don't think you would have much argument with an age somewhere close to there.

Also I dont understand how testing of assignments can vary with the
ta. Arent you required to have the same test cases for every
student in the class to keep things fair.

Let me put it this way. The TA will be grading by the requirements on the milestone. That is:

Since this is a design course TA's are given a certain latitude in grading. Your design is being tested. Sometimes it takes more than one standard script to see the performance of the design. To put it another way, CS2340 TA's normally do everything they can within the constraints laid out on the milestone page to get a program to run. This is why I say that if you are in doubt ask the TA that is grading the milestone.

Sami Deen

In a prior post in M1's question page, in response to a question by T. Scott, Rich LeBlanc stated: 'Every family (see my Thinking Ahead note in the Milestone statement) is an independent piece of your information representation.' Does this imply that class Person is completely independent from class Family while Family is not independent from Person? In other words, does this mean that the instances of Family from a constructed geneological tree could be deleted and not affect the representation by Person? Who is Chris Hunt?

Family and Person are not independent in the sense that it takes Person records to provide information about the individuals in a family. However, if you deleted all of the Family instances, the individual infofmation about each Person would still be available. The point of my use of "independent" in my previous answer was that each Family instance is independent of other Family instances. To add a bit more detail: a Family record might contain references to the parents and to a collection of their children, plus information that describes the family as a whole, like a marriage date. The Person instances it references would contain the information about the individuals in the family, the parents and children. A Person would also provide access to all of the Families in which a person participates – 1 as a child and 0 or more as a parent. Rich LeBlanc

Sami answering one of his posts said that we could connect mirror and transitive information on the fly. In which case these steps wouldnt show in the report generated by the check command. Is this ok?


It is your job to:
1. Maintain a correct data structure based on the data you have.
This includes connecting mirror and transitive information.

2. Write a check function which:
a) Reports data that you require to finish building,
and populating your data structure.
b) Reports data tha is creating a contradiciton or a conflict.

How you achieve these 2 goals is entirely up to you.
Sami Deen

Check for vital information says you have to check for missing death
location. Assuming the accessors remain the same from m1 there is no
way to specify death location.

Yes, that turned out to be a hypothetical example. Sami Deen

Can a TA please post an example of what it means to 'suggest where the
information may be found'.
  1. The urls listed on the coweb dont seem to specialize in any area of genealogy data. So you could find the information you are looking for in any one of those websites.
  2. You do want us to simply list the urls?
  3. Or Do you want us to list a cgi url that will jump straight to the search result.

URL's are what we are looking for.


Missing birth record for XXX. This information may be available at on of the following websites

Do you want us to print that for every piece of missing information?
Or can we just print it in the beginning of the report saying any
missing information could be found at these websites?

Incidentally, I don't agree that you have to sign your questions. It's up to you. Just be aware that you have the option!

Also, please do not delete other people's text on a coweb. Respond if you like. Summarize a page if you are really gung ho. But don't just delete it. Let's have free speech and open debate, etc. Besides, I happen to agree with the brilliant oh-so-anonymous person who posted the above. -Lex Spoon

I just want to make sure that when running a check vital info for a certain person, we only check vital information for all descedants/ancestors of that person? And that we don't check the siblings of that person, nor do we check any unrelated people. -Leo Chang

Is there any way to concatenate a new line onto a String in squeak?


ln := String with: (Character cr).
Concatenating ln with any string will cause a line break.|

So, when we do a Query searchFor: p, should we check for all the information or assume that it will all be valid and complete. If we dont assume (which is what I think it will be), then should we print out our report from checking?

So say something like this:
[Data entered here]
Query searchFor: p.
Checking info...

Querying data...
[Printing search results here]

Or would you rather not have us print the checking info part for the query?


How do you convert a string to stream?

You can use ReadStream to treat any collection as a readable stream. Likewise for WriteStream. -Lex Spoon

Please give your teams distinct names on the Fall 2002 Team Declaration Page. Currently we have a several teams simply named ‘team’. We’ll have to name these teams team1, team2, team 3, … if names are not volunteered! I’ll assign teams to TA’s late tonight. You’ll be able to see who your TA is on the turnin swiki at:

Sami Deen

What should the following command return?
Query surName: 'Flintstone'
Should it be a collection of Persons with the last name 'Flintstone'? or is it a "Query Object" that holds information that the search is based on surName = Flintstone, which the searchFor method in Person will use to perform the search. - Namit Bhatia.

It should return an instance of Query that tells Person to search for everyone with the surname of 'Flintstone'. Chris Verges

Lets say that x has a known mother y, but we don't know the father. In M1, it states that the method signature is supposed to be y hasChild: x with: father. But we don't know the father, but it seems stupid to not be able to enter this as a child for the mother since we know that relationship exists.

To extend this to M2, since it's been stated that mirroring can take place as relationships are set up rather than fix problems later on (even if it wasn't, the following problem would still stand), lets say we have the call x hasMother: y...well if we go to mirror that relationship using the method y hasChild: x with: father, if a father is not known, or even if it just hasn't been entered yet, how are we supposed to fix this mirroring?

I guess what I'm asking is, is it okay to make a new method, hasChild:? It seems like it be against the point of this project to limit the manner in which you could enter known information...if I know the mother, but not the father, it does me no good with a method requires both parents.

You are seeing the limits of the interface between the code and the user here. When you have a good interface , its easier to maintain good data structures. The lesson to take away is to realize that interface is extremely important. You can most certainly create any new methods you want to help you auto fix, or fill in the parts of the data structure that you are aware of. Notice #hasChild: will never be exposed to the user since the TA's will not be testing methods not mentioned in the milestone. Sami Deen

Simply call A hasChild: B with nil.
If you implemented a good family structure then A will become part of a family with a man (A, assuming A is male), an unknown woman and one child - B. If later the information for B's mother does show up or B finds a sibling with known mother or simply a person D calls D hasChild: B with A, the woman field in the appropiate family is updated.

Do queries need to support multiple lookups for each item? IE, can a single query be given more than one givenName to look up?

Also, from the M2 specifications for Query, it says we must support hasAlias without any parameters. Are we then to assume that hasAlias checks only to see if we have aliases at all, and not if we have a specific alias? Ryan Graciano

The section in the milestone that you are refering to that mentions hasAlias bears the heading: "Queries based on any relationship or information from M1". You need to be able to query for any data in your data structure. Sami Deen

What is that supposed to mean?? You did not answer the question.

The info says the following command format should be supported: p searchFor: (Query givenName: 'fred') or Person searchFor: (Query givenName: 'fred'). That seems to imply that the only way to create a query object is through static(class) methods in the Query class. An instance of the query object need not support any modifiers. Hence the given format cant support multiple queries.

Are there only those 3 global Query types - livedIn, livedOn, and generalSearch? And I assume that generalSearch covers only the miscellaneous field information (and not the key to access the field, but the actual data - ie if you do a record: "peanuts" as: "tasty", and a record: "other" as: "walnuts", then do generalSearch: "nuts", then only the second record would be found). Ryan Graciano

(Query livedIn: 'Chicago')
mike record: 'Chicago Bulls' as: 'Captain'.
Shouldnt mike test positive for the test?
TAs please answer.

Hello, for the BlackBox testing, should we write test cases for M1 criteria like surName or birth date, M2 criteria like missing information or relationship errors, or for a mix of both?

Also, how complex should our test cases be, should we have a test case for every method in the program or just some of the methods?

Thanks you,
Joanthan Gdalevich

Test for both. In other words test for things that could go wrong in M2. So for example creating Person objects, which was an M1 function, needs to be tested in order for you to be assured that M2 will work properly. Sami Deen

Here is a summary of some unanswered questions from above:

1) Do all queries have to be used through the Person searchFor: method? Yes.

2) Should Query surName: 'Flintstone' actually perform a search? No.

3) Do you want us to print [URL locations] for every piece of missing information? Or can we just print it in the beginning of the report saying any missing information could be found at these websites?
The formating is your choice, but only trigger the message if there is missing information. Also, all missing information needs to be listed so the user knows what he/she needs to go out and find at the websites.

4) What should the following command return: Query surName: 'Flintstone' A collection of Person objects with the last name 'Flintstone'.

5) So, when we do a Query searchFor: p, should we check for all the information or assume that it will all be valid and complete? No, don't assume that it is valid and complete.

6) If we dont assume (which is what I think it will be), then should we print out our report from checking? No. Print that report when it is requested.

Sami Deen

>>>Should Query surName: 'Flintstone'. actually perform a search?
what the heck is that statement supposed to do then?

The syntax is on the milestone is:
p := Person new.
p searchFor: (Query surName: 'Flintstone').

This is the same as:
p := Person new.
q := Query surName: ‘Flintstone’.
p searchFor: q.

All searches are done through a Person object. The only way to do a search is by doing:
p searchFor:

Then pass in a properly instantiated Query object. searchFor examines the Query object, pulls out data to be searched for, and executes the query.

Sami Deen

What about Query generalSearch: '384'? Jonathan Taylor

Still passed in to a Person object. searchFor needs to be wired to deal with it.

from the deliverables in the milestone assignment:

1. CRC Card analysis of objects: Classes considered and rejected, and CRC cards for each class in the user interface.

what user interface is this refering to?

i'm assuming you don't mean graphical user interface, since there's no such gui assigned.

so, to what, exactly, does this refer?

Its just saying make sure you have CRC cards for everything. BTW the rejected ideas (CRC cards) are important. Always include at least a few of them. They showed that you explored the problem. The final CRC cards represent only the solution. Sami Deen

Trying to find friend, in the dallas areaor may be gone out of texas, his name is lonnie Welch, contact borden76201@yahoo.complease.

i want to faed my mother annette miranda garcia madre de juan c trinidad miranda

Link to this Page